异步网络应用程序处理方法

文档序号:6436804阅读:234来源:国知局
专利名称:异步网络应用程序处理方法
技术领域
本发明涉及网络通信技术,尤其涉及一种异步网络应用程序处理方法。
背景技术
异步网络应用,是指当发起一个线程的调度后,调用者并不需要等待结果,而可以去处理其他事件,而执行该线程调用的逻辑单元在完成调用后,将结果通过状态、消息、或者回调的方式通知调用者。而与之相对的同步网络应用是指调用者发起调度后,不执行其他任务,只等待该调用的结果。可以看出,异步网络应用是一种效率更高的网络通信方式。随着互联网的快速发展,各种异步网络应用不断丰富,因此,对网络应用软件的稳定性、高效性都提出了越来越高的要求。目前被广泛应用的异步网络应用程序处理方法有以下几种:(I)多线程处理方法。在该方法中,对于服务器与单个客户端之间建立的会话,对于服务器与单个客户端之间建立的会话都建立独立的进程/线程进行处理。因此,这种方法将创建大量的进程/线程,从而消耗大量的系统资源,而且,众多线程之间的同步和切换也会导致系统效率的大幅下降。(2)单线程处理方法。在该方法中,以单一的线程来处理所有的网络会话的相关运算。即所有网络相关操作,都由一个线程,通过操作系统支持的多路复用技术,实现对多会话网络业务的并发支持。这种模型可以节约系统资源,但其响应速度和并发度都存在不足,应用编写者任何一行不合理的代码都会导致整个系统失去响应。(3)线程池处理方法。在该方法中,需要建立有限的多个线程,所有的网络相关操作,由线程池中的有限个线程来承载。在所述多个线程中,设置一个管理线程,由所述管理线程来调度线程池中的其他线程,并且处理各个事件。例如,当一个管理线程发现了一个事件,根据不同的网络应用,所述管理线程有可能分配其他线程去处理;或者,该管理线程也可能由自身来处理该事件,即将自身降级为一般线程,而将其他线程升级为管理线程。可以看出,由于这种线程池处理方法引入了管理线程,使得多个线程间的线程均衡算法较为复杂,因此可扩展性和可维护性不强。而且,均衡算法若设计得不好,还会带来很大的系统开销。网络应用程序会大量地采用定时器,在现有的应用中,很多程序会以一个或多个线程固定作为定时器的超时处理线程,即为了定时器而新建线程,这会引起系统性能的大幅下降,在定时器的易用性和高效性上都会存在很大问题。另外,在一个网络应用中,应用内部的逻辑对象之间需要大量的通信。例如:逻辑对象A需要调用逻辑对象B执行一个持续时长不确定的事务,而对象B在执行完毕后,需要通知对象A。在现有的很多实现中,这一般通过如下方式来实现:对象A在调用对象B时,传给B —个指向某个属于A的函数的指针,当对象B完成事务后,通过这个指针调用对象A的某个函数,从而达到通知对象A的目的。在这种实现方式中,指针只有通信的对象双方知悉,通信也只在对象双方进行,系统的线程并未参与对通信内容、通信过程的管理,一旦对象的双方或一方注销,就会发生通信内容的丢失甚至程序失败,这会危及整个系统的安全,也不利于网络应用程序的维护和扩展。

发明内容
针对现有技术的缺陷,本发明的目的是提供一种能够简便地实现线程和事件管理的异步网络应用程序处理方法。本发明提供的异步网络应用程序处理方法包括:a.建立多个线程,其中各个线程具有相同的运行逻辑;b.其中一个线程获得全局锁,从而获得对事件队列的处理权;c.具有事件队列处理权的线程查询待处理事件队列,当待处理事件队列中存在待处理事件时,则该线程读取一个待处理事件,以便对该待处理事件进行处理;当待处理事件队列中不存在待处理事件时,则该线程对事件列表进行监测,当该线程监测到事件时,将所述事件加入待处理事件队列;d.在出现以下三种情况的任何一种时,当前获得所述处理权的线程退出全局锁,由所有线程竞争全局锁,并执行步骤b: (I)当前获得所述处理权的线程读取一个待处理事件后退出全局锁,并且在处理完该事件后与其他线程竞争全局锁;(2)当前获得所述处理权的线程将事件列表中的事件都加入待处理事件队列;(3)当前获得所述处理权的线程对事件列表完成了一个线程循环周期的监测。优选地,步骤c包括:cll.对定时器事件进行监测;cl2.在一次监测完成之前,计算所有定时器各自距下次超时的时间差,当一个定时器的时间差小于定时器的最小精度时,则该定时器到期,具有事件队列处理权的线程将其转换成超时事件,并将该超时事件加入待处理事件队列;cl3.具有事件队列处理权的线程查询所述待处理事件队列,当待处理事件队列中存在超时事件时,则该线程对所述超时事件进行处理;当待处理事件队列中不存在待处理事件时,则该线程对事件列表进行监测,当该线程监测到超时事件时,将超时事件加入待处理事件队列。优选地,步骤cll还包括,具有事件队列处理权的线程找出所有定时器的最小到期时间,以所述最小到期时间和最小线程循环周期中的最小值为监测周期,对定时器事件进行监测。优选地,本发明的异步网络应用程序处理方法还包括:将定时器事件从监测的事件中删除,以实现对定时器的注销。优选地,多个线程随机地获得全局锁。优选地,步骤c还包括以下步骤:c21.当一个源对象需要发送消息时,则所述源对象通过异步消息发送接口向目的对象发送消息,同时,源对象在消息队列中记录异步消息记录项;c22.具有事件队列处理权的线程根据接收到的告知信息从消息队列中接收异步消息记录项;c23.根据所述记录项读取记录的内容,所述具有事件队列处理权的线程将异步消息记录项转换成待处理的异步消息事件,并将所述异步消息事件加入待处理事件队列。优选地,步骤c21包括:当仅有该源对象向消息队列发送了异步消息记录项时,则在该源对象向消息队列发送异步消息记录项的同时,该源对象向具有事件队列处理权的线程发送告知信息。优选地,源对象通过特定的管道向具有事件队列处理权的线程发送告知信息。
优选地,所述特定的管道是命名通道、文件句柄或套接字。优选地,所述异步消息记录项包括源对象ID、目的对象ID、消息内容。相对于现有技术,本发明的异步网络应用程序处理方法,通过建立多个等效的线程以及多个线程之间对全局锁的竞锁逻辑,实现了对多线程简洁、高效的管理,节约了软硬件资源,简化的异步网络应用程序的处理算法。进一步的,本发明还在上述线程调度的基础上提供了相应的定时器事件管理方法,通过简洁的线程模型进行超时处理,从而在不引入其他资源情况下,实现了轻量级的定时器机制。而且,本发明还在上述线程调度的基础上实现了一种对象之间的通信管理方法,通过线程对通信双方消息交互的处理,保证了对象之间通信的安全性,使得异步网络应用程序的运行更加稳定。


图1是本发明一种具体实施方式
的异步网络应用程序处理方法的流程图。
具体实施例方式如图1所示,本发明一种具体实施方式
的异步网络应用处理方法包括以下步骤:在步骤101,建立多个线程。所建立的多个线程具有等同的运行逻辑,S卩,各个线程之间的地位是平等的,不存在对于其他线程具有管理支配功能的管理线程,各线程相互为等效线程。线程对事件的处理执行,线程通过获得全局锁来获得对事件的处理权。线程的建立可以通过应用程序接口来完成。全局锁具有互斥的特性,S卩,任意时刻只有一个逻辑模块能获得锁,从而任意时刻只有一个逻辑模块能获得锁的线程即获得队列的处理权。在本发明中,所述逻辑模块可以是步骤101中建立的多个线程中的任意一个。建立线程可以通过各种适合的编程手段来实现,例如,在程序的主函数内,通过应用程序接口建立多个线程,用户通过应用程序接口的参数,传入系统希望建立的线程个数。对于多CPU的计算机系统,为了更好的利用多CPU资源,线程的个数优选为大于或等于参数值、且是CPU个数的整数倍数。考虑到线程所占系统资源,以及多线程调度可能加剧线程切换等问题,本发明可以将线程最大个数设置为32个,但也可视系统具体情况而作调整。所有线程针对的是一个由一个全局锁保护的列表,即事件队列。该事件队列记录了相关的对象和需要关注的事件集合。通过对全局锁的竞争,多个等效线程中的某一个获得此全局锁,即取得了此事件队列的处理权。因此,在步骤102,上述线程中的一个获得了全局锁,从而获得事件队列的处理权。所有线程对全局锁的竞争是平等的,即,所有线程随机排列,等待获得全局锁,在第一个线程获得全局锁后,对事件队列进行相关处理,然后释放全局锁,再由下一个随机排列的线程获得该全局锁,继续对事件队列进行处理。在出现以下三种情况的任何一种时,当前获得所述处理权的线程退出全局锁,并且重新由所有线程竞争获得全局锁:第一,当前获得所述处理权的线程读取一个待处理事件后退出全局锁,并且在处理完该事件后与其他线程竞争全局锁;第二,当前获得所述处理权的线程将事件列表中事件都加入待处理事件队列;第三,当前获得所述处理权的线程对事件列表完成了一个线程循环周期的监测。在步骤103,具有事件队列处理权的线程查询待处理事件队列,以确定在待处理事件队列中是否已经存在待处理事件。若在事件队列中存在待处理事件,则在步骤104,该线程读取一个待处理事件,以便进一步驱动与该事件绑定的对象,调用对象实现的处理函数处理所述事件,从而完成业务逻辑。若待处理事件队列为空,即待处理事件队列中没有待处理事件,则在步骤105,该线程进行事件列表的监测,以收集待处理事件集。综上所述,所建立的多个等效线程,优先进行待处理事件的处理工作,若具有待处理事件队列处理权的线程发现没有待处理事件时,则进行事件监测。在步骤106,当具有待处理事件队列处理权的线程监测到事件时,将所述事件加入待处理事件队列。在上述对线程的调度方法的基础上,本发明还提供了两种重要的应用:一种是对定时器的管理;另一种是对于对象之间通信的管理。在具体采用C++语言编程实现上述异步网络应用程序处理方法的时候,可以进行如下处理:提供一个C++基类,如命名为CNetHander, CNetHandler的派生类通过该基类提供的事件注册接口,注册相关的网络、定时器超时等事件,并实现事件对应的回调函数。则当相关的事件发生时,所述事件将被当前监测事件队列的线程发现,并转换成待处理事件,再由该线程或者其他线程获取,驱动此事件绑定的对象,调用对象实现的回调函数,即可在回调函数中实现业务逻辑。由于网络应用本身的特殊性,通常会大量使用定时器,定时器也可以作为一种待处理的事件。在本发明的一种优选实施方式中,对定时器的管理过程如下:I)建立多个线程,所建立的多个线程具有等同的运行逻辑。2)通过获得全局锁而得到事件队列处理权的某个线程,对事件队列进行查询。具有事件队列处理权的线程查找在事件队列中是否存在待处理事件。若在事件队列中存在待处理事件,则该线程驱动与该事件绑定的对象,调用对象实现的处理函数处理所述事件,从而完成业务逻辑;若事件列表为空,即事件列表中没有待处理事件,则该线程进行事件列表的监测,以收集待处理事件集。3)在网络应用的业务逻辑需要使用定时器时,可以通过应用程序接口(例如前述CNetHandler类的对象)的定时器创建接口,创建一个或多个定时器,此时定时器成为待监测事件。4)当具有事件队列处理权的线程发现事件队列中有定时器超时事件,则进行处理,例如由所述线程调用相应对象的超时处理函数,以实现超时处理逻辑。当具有事件队列处理权的线程发现事件队列中没有待处理事件时,则开始监测事件。具体地,找到所有定时器中的最小到期时间,以最小到期时间和线程最小循环时间中的最小值为监测超时时间,进行事件监测。所述监测超时时间即进行一次监测的周期。5)在线程监测超时之前,无论有没有待处理事件出现,在监测完成时更新各定时器距下次超时的时间差,所述时间差即用定时器的到期时间减去线程最小循环之后的差值,若时间差已经小于定时器的最小精度,则该定时器到期,负责监测的线程将其转换成超时事件,加入待处理的事件队列。例如:在当前时刻,定时器的精度为1ms,线程最小循环时间为5ms,定时器的到期时间为10ms,定时器距下次超时的时间差为5ms,因此定时器尚未超时;而当定时器的到期时间还剩5ms时,定时器距下次超时的时间差为0ms,因此此时定时器已超时。6)具有事件队列处理权的线程在读取待处理事件时,如果读取到超时事件,则进行超时处理,例如:通过回调函数调度,触发对象的超时处理流程。7)若需要注销定时器,则通过应用程序接口(例如前述CNetHandler类的对象提供的定时器注销接口),将定时器从待监测事件队列中删除,从而完成定时器注销。在本发明的另一种优选实施方式中,基于所描述的线程处理方法,实现对象之间通信的管理,具体过程如下:(i)建立多个线程,所建立的多个线程具有等同的运行逻辑。(ii)通过获得全局锁而得到事件队列处理权的某个线程,对事件队列进行查询。若在事件队列中存在异步消息事件,则该线程驱动与该事件绑定的对象,调用对象实现的处理函数处理所述事件,从而完成业务逻辑;若事件队列为空,即事件队列中没有待处理事件,则该线程进行事件列表的监测,以收集待处理事件集。(iii)若一个源对象A (例如CNetHandler派生类对象)需要发送消息,则通过异步消息发送接口(例如CNetHandler派生类的父类消息发送接口),向目的对象B发送消息。CNetHandler派生类所创建的对象可以获取统一分配的唯一对象ID,所以此类对象可以通过这个ID进行异步消息的发送和接收,实现相互间的通讯。同时,源对象A在消息队列中记录一个异步消息记录项,该记录项记录了消息源为A的对象ID,消息目的为B的对象ID,以及消息内容。在一种具体实施方式
中,消息发送接口可以首先将消息转换成消息项,将所述消息项记录在消息队列中。优选地,在源对象通过异步消息发送接口提交异步消息记录项时,若发现当前事件队列中没有其它待处理的异步消息提交项,则需要告知具有事件队列处理权的线程当前有异步消息需要处理。具体地,源对象通过异步消息发送接口查看消息队列的长度,若消息队列长度为1,则说明仅有这一个待发送消息,因此需要告知目前得到待处理队列处理权的线程及时获取该消息。可以在系统初始化时创建一个管道来实现所述告知过程,将该管道的读端加入事件队列,以监测管道的可读事件[11],当消息队列长度为I时,向所述管道中写入一段信息(例如一个字节),以告知目前具有待处理队列处理权的线程。所述管道可以利用C++语言中的命名管道、文件句柄或套接字来实现。若源对象发起异步消息时,消息队列中已经存在待监测转换的消息项,说明目前具有待处理队列处理权的线程正在处理异步消息,则源对象仅需提交异步消息项,等待所述异步消息项被线程处理。(iv)具有事件队列处理权的线程接收到异步消息记录项后,根据所述记录项读取记录的内容,将其转换成一个待处理的异步消息事件,直到记录项列表中所有异步消息记录项都被转换成待处理的异步消息事件,并将所述异步消息事件加入事件队列。(V)具有事件队列处理权的线程从事件队列中读取所述异步消息事件,以便该异步消息事件进行处理。例如,通过回调函数触发消息处理流程。若对象A在向对象B发送了一个异步消息后,在消息到达对象B之前,对象B被销毁了,则线程在处理该异步消息时,就无法通过ID找到对象B,线程就会对该消息作丢弃处理,所以对整个系统不会产生任何危害。同样的,若对象A在向对象B发送了一个异步消息后,在消息到达对象B之前,对象A被销毁了,那么该消息还是会安全地到达对象B并被正确处理,只是,若此时对象B要向对象A回复消息,则该消息会被线程丢弃。因此,在本发明在异步消息的传递过程中,无论通信的对象双方发生了怎样的变化,通信始终是安全的、无害的。尽管本发明是通过上述的优选实施方式进行描述的,但是其实现形式并不局限于上述的实施方式。应该认识到:在不脱离本发明主旨的情况下,本领域技术人员可以对本发明做出不同的变化和修改。
权利要求
1.一种异步网络应用程序处理方法,其特征在于,所述方法包括: a.建立多个线程,其中各个线程具有相同的运行逻辑; b.其中一个线程获得全局锁,从而获得对事件队列的处理权; c.具有事件队列处理权的线程查询待处理事件队列,当待处理事件队列中存在待处理事件时,则该线程读取一个待处理事件,以便对该待处理事件进行处理;当待处理事件队列中不存在待处理事件时,则该线程对事件列表进行监测,当该线程监测到事件时,将所述事件加入待处理事件队列; d.在出现以下三种情况的任何一种时,当前获得所述处理权的线程退出全局锁,由所有线程竞争全局锁,并执行步骤b: (I)当前获得所述处理权的线程读取一个待处理事件后退出全局锁,并且在处理完该事件后与其他线程竞争全局锁;(2)当前获得所述处理权的线程将监测到的事件都加入待处理事件队列;(3)当前 获得所述处理权的线程对事件列表完成了一个线程循环周期的监测。
2.根据权利要求1所述的方法,其特征在于,步骤c包括: cll.对定时器事件进行监测; cl2.在一次监测完成之前,计算所有定时器各自距下次超时的时间差,当一个定时器的时间差小于定时器的最小精度时,则该定时器到期,具有事件队列处理权的线程将其转换成超时事件,并将该超时事件加入待处理事件队列; cl3.具有事件队列处理权的线程查询所述待处理事件队列,当待处理事件队列中存在超时事件时,则该线程对所述超时事件进行处理;当待处理事件队列中不存在待处理事件时,则该线程对事件列表进行监测,当该线程监测到超时事件时,将超时事件加入待处理事件队列。
3.根据权利要求2所述的方法,其特征在于,步骤cll还包括,具有事件队列处理权的线程找出所有定时器的最小到期时间,以所述最小到期时间和最小线程循环周期中的最小值为监测周期,对定时器事件进行监测。
4.根据权利要求2所述的方法,其特征在于,所述方法还包括:将定时器事件从监测的事件中删除,以实现对定时器的注销。
5.根据权利要求1所述的方法,其特征在于,多个线程随机地获得全局锁。
6.根据权利要求1或2所述的方法,其特征在于,步骤c还包括以下步骤: c21.当一个源对象需要发送消息时,则所述源对象通过异步消息发送接口向目的对象发送消息,同时,源对象在消息队列中记录异步消息记录项; c22.具有事件队列处理权的线程根据接收到的告知信息从消息队列中接收异步消息记录项; c23.根据所述记录项读取记录的内容,所述具有事件队列处理权的线程将所有异步消息记录项转换成待处理的异步消息事件,并将所述异步消息事件加入待处理事件队列。
7.根据权利要求6所述的方法,其特征在于,步骤c21包括:当仅有该源对象向消息队列发送了异步消息记录项时,则在该源对象向消息队列发送异步消息记录项的同时,该源对象向具有事件队列处理权的线程发送告知信息。
8.根据权利要求7所述的方法,其特征在于,源对象通过特定的管道向具有事件队列处理权的线程发送告知信息。
9.根据权利要求8所述的方法,其特征在于,所述特定的管道是命名管道、文件句柄或套接字。
10.根据权利要求6所述的方法,其特征在于,所述异步消息记录项包括源对象ID、目的对象ID、消息内容 。
全文摘要
本发明公开的异步网络应用程序处理方法包括建立多个线程,其中各个线程具有相同的运行逻辑;其中一个线程获得全局锁,从而获得对事件队列的处理权;具有事件队列处理权的线程查询待处理事件队列,当待处理事件队列中存在待处理事件时,则该线程读取一个待处理事件,以便对该待处理事件进行处理;当待处理事件队列中不存在待处理事件时,则该线程对事件列表进行监测,当该线程监测到事件时,将所述事件加入待处理事件队列。本发明通过建立多个等效的线程以及多个线程之间对全局锁的竞锁逻辑,实现了对多线程简洁、高效的管理,节约了软硬件资源,通过简洁的线程模型进行超时处理,实现了轻量级的定时器机制和安全高效的异步消息机制。
文档编号G06F9/46GK103092682SQ20111033547
公开日2013年5月8日 申请日期2011年10月28日 优先权日2011年10月28日
发明者何林强, 周明伟, 张兴明, 傅利泉, 朱江明, 吴军, 吴坚 申请人:浙江大华技术股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1