数据分发方法和装置制造方法

文档序号:6506689阅读:147来源:国知局
数据分发方法和装置制造方法
【专利摘要】本发明公开了一种数据分发方法和装置,所述方法包括:接收线程接收数据;接收线程按照环形存储队列中的存储区的序号,对所述存储区进行写操作,将接收到的所述数据存储到所述存储区中;至少一个发送线程对所述接收线程已经完成写操作的存储区进行读操作,读取存储数据,并将所述存储数据发送给与至少一个发送线程对应的至少一个接收端。应用本发明技术方案,能够提高数据分发处理的效率。
【专利说明】数据分发方法和装置
【技术领域】
[0001]本发明涉及数据传输【技术领域】,特别是涉及一种数据分发方法和装置。
【背景技术】
[0002]随着计算机和网络技术的发展,在很多网络服务中实现了数据的分发处理。例如,在音视频点播系统中,多个客户终端可以点播同一个视频源的音视频数据。
[0003]传统的数据分发技术,以上述音视频点播系统为例,是通过转发服务器将视频源的数据分发给点播视频的多个客户终端。转发服务器通过多线程技术,将数据分发给多个客户终端,为了保证多个线程进行数据的读和写操作时,不发生冲突,通常的做法是采用线程锁技术,也就是不能同时有两线程进行读或写操作,线程锁技术虽然保证了安全性,但是等待线程锁释放的线程会被挂起直至线程锁释放,由此降低了系统的性能和数据分发处理的效率。

【发明内容】

[0004]基于此,有必要提供一种数据分发方法和装置,能够提高数据分发处理的效率。
[0005]一种数据分发方法,所述方法包括:
[0006]接收线程接收数据;
[0007]接收线程按照环形存储队列中的存储区的序号,对所述存储区进行写操作,将接收到的所述数据存储到所述存储区中;
[0008]至少一个发送线程对所述接收线程已经完成写操作的存储区进行读操作,读取存储数据,并将所述存储数据发送给与至少一个发送线程对应的至少一个接收端。
[0009]一种数据分发装置,所述装置包括:
[0010]接收线程,用于接收数据;
[0011]存储模块,所述存储模块以环形存储队列形式存储数据,所述环形存储队列包括多个存储区,每一所述存储区对应于一个序号;
[0012]所述接收线程,还用于按照环形存储队列中的存储区的序号,对所述存储区进行写操作,将接收到的所述数据存储到所述存储区中;
[0013]至少一个发送线程,用于对所述接收线程已经完成写操作的存储区进行读操作,读取存储数据,并将所述存储数据发送给与至少一个发送线程对应的至少一个接收端。
[0014]上述数据分发方法和装置,在进行数据分发处理时,通过一个接收线程接收数据源的数据,并把数据循环存储在环形存储队列的存储区中,至少一个发送线程保持在接收线程之后,读取接收线程已经完成写操作的存储区中的存储数据,并将存储数据发送给对应的至少一个接收端,与传统的数据分发相比,不需要通过线程锁技术,发送线程之间没有占锁和等待锁释放的处理过程,降低了数据分发处理的复杂性,提高了数据分发处理的效率。【专利附图】

【附图说明】
[0015]图1为一个实施例中的数据分发方法的流程示意图;
[0016]图2A至图2D为一个实施例中的数据分发处理的工作示意图;
[0017]图3A为数据分发处理发生数据丢包的示意图;
[0018]图3B至图3C为一个实施例中的数据分发处理的工作示意图。
【具体实施方式】
[0019]为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
[0020]参见图1,在一个实施例中,提供了一种数据分发方法。该方法适用于将一数据源的数据分发给至少一个接收端的工作场景,例如可以是多个用户客户端点播同一视频节目的场景。本实施例中的数据分发处理方法,其流程包括:
[0021]步骤102,接收线程接收数据。
[0022]数据分发任务开始后,通过接收线程接收数据源的数据。在本实施例中,数据源可以是音视频服务器等。音视频服务器可以但不限于通过摄像头、话筒等输入装置获取实时数据,也可以预先存储有音视频数据。接收线程接收音视频数据,以供后续发送线程发送给多个接收端。
[0023]步骤104,接收线程按照环形存储队列中的存储区的序号,对存储区进行写操作,将接收到的数据存储到存储区中。
[0024]接收线程接收数据源的数据,例如音视频数据,按照预设的环形存储队列中的存储区的序号,循环对存储区进行写操作,存储接收到的数据。
[0025]参见图2A,本实施例中,环形存储队列202可以是包含100个存储区的存储队列,相应序号为0,I……99,100个存储区的存储空间大小可以设置为相同的大小,例如1500字节,接收线程循环对100个存储区进行写操作,存储所接收到的数据。
[0026]在本实施例中,可以通过一个curWrittenlndex变量协调接收线程的工作状态,curffrittenlndex变量标识接收线程已经完成写操作的存储区的序号。在数据分发任务未开始时,curffrittenlndex变量的值初始化_1。参见图2B,数据分发任务开始,接收线程204开始工作,接收数据源的数据,并把接收到的数据写到环形存储队列202中的O号存储区。参见图2C,接收线程204对O号存储区完成写操作,开始将数据写入环形存储队列202中的I号存储区,这时curWrittenlndex变量进行自增I处理,值变为O,用于标识接收线程204已经完成O号存储区的写操作。其余的存储区依次类推,接收线程只负责接收数据,存储数据,与发送线程工作状态无关。
[0027]步骤106,至少一个发送线程对接收线程已经完成写操作的存储区进行读操作,读取存储数据,并将存储数据发送给与至少一个发送线程对应的至少一个接收端。
[0028]发送线程与接收端一一对应,在本实施例中,至少一个发送线程基于网络协议地址和端口号与至少一个接收端对应。随着接收端的增加或减少,发送线程的数目也相应进行动态的变化。多个发送线程之间的工作是相互独立的,都保持在接收线程之后,对接收线程已经完成写操作的存储空间进行读操作,读取存储数据,并把存储数据发给接收端。[0029]在本实施中,对于每一个发送线程对应于一个curSendlndex变量来协调工作状态,curSendlndex变量标识对应的发送线程正在进行读操作的存储区的序号。发送线程正常工作时,curSendlndex变量的值保持不超过curWrittenlndex变量的值。例如,发送线程在创建后,curSendlndex变可以初始化为-1,之后发送线程每隔一定时间,如可设置为I毫秒,循环读取 curWrittenlndex 的值,如果 curWrittenlndex ^ O,则把 curWrittenlndex变量的值赋给curSendlndex变量,在curSendlndex的值发生变化后,发送线程就发送对应于curSendlndex变量值的序号的存储区数据给对应的接收端。当发送线程每发送完一个存储区的数据,发送线程以预设的时间间隔,循环判断curSendlndex变量自增I处理后 是否超过curWrittenlndex变量的值,如果超过,则curSendlndex变量的值保持不变;如未超过,则curSendlndex变量进行自增I处理,发送线程就发送对应的下一存储区的存储数据。例如,参见图2C,接收线程204对环形存储队列202中的I号存储区进行写操作,curffrittenlndex变量的值为O,发送线程206读取到curWrittenlndex变量的值,将发送线程206对应的curSendlndex变量的值赋值为0,发送线程206开始读O号存储区中的存储数据,并把存储数据发送给发送线程206对应的接收端。又例如,参见图2D,接收线程204正在对环形存储队列202中的6号存储区进行写操作,curWrittenlndex变量的值为5,此时发送线程206完成3号存储区的读操作,发送线程206对应的curSendlndex变量值为3,这时发送线程206判断其对应的curSendlndex变量自增I处理后值为4,不超过curWrittenlndex变量的值,贝U发送线程206对应的curSendlndex变量自增I,发送线程206相应开始读取4号存储区的数据,并进行发送;假设此时也有发送线程208完成5号存储区的读操作,而接受线程204仍未完成6号存储区的写操作,curWrittenlndex变量的值为5,发送线程208对应的curSendlndex变量值为5,发送线程208判定curSendlndex变量自增I处理后超过curWrittenlndex变量,则curSendlndex变量值保持不变,之后发送线程208以预设的间隔时间进行循环判断,直到发送线程208开始下一存储区数据的发送。
[0030]本实施例提供的数据分发方法,在进行数据分发处理时,通过一个接收线程接收数据源的数据,并把数据循环存储在环形存储队列的存储区中,至少一个发送线程保持在接收线程之后,读取接收线程已经完成写操作的存储区中的存储数据,并将存储数据发送给对应的至少一个接收端,与传统的数据分发相比,不需要通过线程锁技术,发送线程之间没有占锁和等待锁释放的处理过程,降低了数据分发处理的复杂性,提高了数据分发处理的效率。
[0031 ] 参见图3A,发送线程306可能发生故障而暂停,这时发送先程304进行数据的写操作,会“追”上发送线程306。发送线程306正常工作后,就会发生数据丢包,丢掉环形存储队列302上100个存储区的数据。
[0032]为减少数据的丢包率,参见图3B和图3C,在一个实施例中,提供了一种数据分发方法的工作示意图。本方法除包括图1、图2A至图2D中实施例的全部步骤外,还包括下列处理步骤:
[0033]发送线程判断:接收线程已经完成写操作的存储区的第一序号是否在发送线程进行读操作的存储区的第二序号之前,并且两序号之间的间隔是否小于预设的第一阀值;若是,则发送线程按照预设的间隔值,间隔读取序号相差该间隔值的存储区中的存储数据,并将存储数据发送给所述发送线程对应的接收端。参见图3B,接收线程304正在对O号存储区进行写操作,接收线程304对应的curWrittenlndex变量值为99。发送线程306恢复工作后,读取3号存储区的存储数据,对应的curSendlndex变量的值为3,这时发送线程306判断两序号的间隔为5,小于预设的第一阀值,例如第一阀值可以设置为10,则发送线程306在发送完3号存储区的数据后,对curSendlndex变量进行加2处理,发送线程306将依次发送5号存储区、7号存储区的数据…,其余类推。
[0034]在发送线程按照预设的间隔值,间隔读取序号相差该间隔值的存储区中的存储数据进行发送之后,记录当前存储区的发送时间;发送线程并判断发送时间是否超过预设的第二阀值;若是,则发送线程按照预设的间隔值,读取下一序号的存储区中的存储数据,并将存储数据发送至所述发送线程对应的接收端。例如参见图3B,当发送线程306判断两序号相差小于预设的第一阀值后,发送线程306记录每一个存储区对应的发送时间,若发送时间超过预设的第二阀值,如10毫秒等,则发送线程将对应的curSendlndex变量进行加2处理,进行下一序号的存储区数据的发送。
[0035]在发送线程按照预设的间隔值,间隔读取序号相差该间隔值的存储区中的存储数据进行发送之后,发送线程判断两序号之间的间隔是否大于第三阀值;若是,则发送线程按照存储区的序号,读取接收线程已经完成写操作的存储区中的存储数据,并将存储数据发送给发送线程对应的接收端,若否,发送线程继续按照预设的间隔值,间隔读取序号相差该间隔值的存储区中的存储数据,并将存储数据发送给所述发送线程对应的接收端。参见图3C,发送线程306判定curSendlndex变量和curWrittenlndex变量的间隔超过预设的第三阀值,发送线程306发送完当前存储区的数据后,后续对curSendlndex变量自增I处理。
[0036]本实施例提供的数据分发方法,不仅提高了数据分发处理的效率,还减少了数据丢包率。
[0037]在一个实施例中,相应提供了一种数据分发装置,包括:
[0038]接收线程,用于接收数据。
[0039]存储模块,存储模块以环形存储队列形式存储数据,环形存储队列中包括多个存储区,每一存储区对应于一个序号。
[0040]接收线程,还用于按照环形存储队列中的存储区的序号,对存储区进行写操作,将接收到的数据存储到存储区中。
[0041]至少一个发送线程,用于对接收线程已经完成写操作的存储区进行读操作,读取存储数据,并将存储数据发送给与至少一个发送线程对应的至少一个接收端。
[0042]在一个实施例中,发送线程还用于判断:接收线程已经完成写操作的存储区的第一序号是否在发送线程进行读操作的存储区的第二序号之前,并且两序号之间的间隔是否小于预设的第一阀值;若是,则发送线程还用于按照预设的间隔值,间隔读取序号相差间隔值的存储区中的存储数据,并将存储数据发送给发送线程对应的接收端。
[0043]在一个实施例中,发送线程用于读取存储区中的存储数据,将存储数据发送给发送线程对应的接收端,并记录当前存储区的发送时间;以及判断发送时间是否超过预设的第二阀值;若是,则发送线程按照预设的间隔值,读取下一序号的存储区中的存储数据,并将存储数据发送至发送线程对应的接收端。
[0044]在一个实施例中,发送线程还用于进一步判断两序号之间的间隔是否大于第三阀值,若是,则发送线程按照存储区的序号,读取接收线程已经完成写操作的存储区中的存储数据,并将存储数据发送给发送线程对应的接收端;若否,发送线程继续按照预设的间隔值,间隔读取序号相差该间隔值的存储区中的存储数据,并将存储数据发送给所述发送线程对应的接收端。
[0045]以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。
【权利要求】
1.一种数据分发方法,所述方法包括: 接收线程接收数据; 接收线程按照环形存储队列中的存储区的序号,对所述存储区进行写操作,将接收到的所述数据存储到所述存储区中; 至少一个发送线程对所述接收线程已经完成写操作的存储区进行读操作,读取存储数据,并将所述存储数据发送给与至少一个发送线程对应的至少一个接收端。
2.根据权利要求1所述的方法,其特征在于,所述方法还包括: 所述发送线程判断:所述接收线程已经完成写操作的存储区的第一序号是否在所述发送线程进行读操作的存储区的第二序号之前,并且两序号之间的间隔是否小于预设的第一阀值; 若是,则所述发送线程按照预设的间隔值,间隔读取序号相差所述间隔值的存储区中的存储数据,并将所述存储数据发送给所述发送线程对应的接收端。
3.根据权利要求 2所述的方法,其特征在于,在发送线程判定第一序号在第二序号之前,并且两序号之间的间隔小于第一阀值之后,所述方法还包括: 所述发送线程读取存储区中的存储数据,将所述存储数据发送给所述发送线程对应的接收端,并记录当前存储区的发送时间; 判断所述发送时间是否超过预设的第二阀值; 若是,则所述发送线程按照预设的间隔值,读取下一序号的存储区中的存储数据,并将所述存储数据发送至所述发送线程对应的接收端。
4.根据权利要求2或3所述的方法,其特征在于,在所述发送线程判定第一序号在第二序号之前,并且两序号之间的间隔小于第一阀值之后,所述方法还进一步包括: 所述发送线程判断两序号之间的间隔是否大于第三阀值; 若是,则所述发送线程按照所述存储区的序号,读取所述接收线程已经完成写操作的存储区中的存储数据,并将所述存储数据发送给所述发送线程对应的接收端;若否,则所述发送线程按照预设的间隔值,间隔读取序号相差所述间隔值的存储区中的存储数据,并将所述存储数据发送给所述发送线程对应的接收端。
5.根据权利要求1所述的方法,其特征在于,所述接收线程接收的数据包括音视频数据,所述至少一个发送线程基于网络协议地址和端口号与所述至少一个接收端对应。
6.一种数据分发装置,其特征在于,所述装置包括: 接收线程,用于接收数据; 存储模块,所述存储模块以环形存储队列形式存储数据,所述环形存储队列包括多个存储区,每一所述存储区对应于一个序号; 所述接收线程,还用于按照环形存储队列中的存储区的序号,对所述存储区进行写操作,将接收到的所述数据存储到所述存储区中; 至少一个发送线程,用于对所述接收线程已经完成写操作的存储区进行读操作,读取存储数据,并将所述存储数据发送给与至少一个发送线程对应的至少一个接收端。
7.根据权利要求6所述的装置,其特征在于,所述发送线程还用于判断:所述接收线程已经完成写操作的存储区的第一序号是否在所述发送线程进行读操作的存储区的第二序号之前,并且两序号之间的间隔是否小于预设的第一阀值;若是,则发送线程还用于按照预设的间隔值,间隔读取序号相差所述间隔值的存储区中的存储数据,并将所述存储数据发送给所述发送线程对应的接收端。
8.根据权利要求7所述的装置,其特征在于,所述发送线程用于读取存储区中的存储数据,将所述存储数据发送给所述发送线程对应的接收端,并记录当前存储区的发送时间;以及判断所述发送时间是否超过预设的第二阀值;若是,则所述发送线程按照预设的间隔值,读取下一序号的存储区中的存储数据,并将所述存储数据发送至所述发送线程对应的接收端。
9.根据权利要求7或8所述的装置,其特征在于,所述发送线程还用于进一步判断两序号之间的间隔是否大于第三阀值,若是,则所述发送线程按照所述存储区的序号,读取所述接收线程已经完成写操作的存储区中的存储数据,并将所述存储数据发送给所述发送线程对应的接收端;若否,则所述发送线程按照预设的间隔值,间隔读取序号相差所述间隔值的存储区中的存储数据,并将所述存储数据发送给所述发送线程对应的接收端。
10.根据权利要求6所述的装置,其特征在于,所述接收线程用于接收音视频数据,所述至少一个发送线程基于 网络协议地址和端口号与所述至少一个接收端对应。
【文档编号】G06F12/02GK103475899SQ201310326816
【公开日】2013年12月25日 申请日期:2013年7月30日 优先权日:2013年7月30日
【发明者】林华景 申请人:深圳市融创天下科技股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1