專利名稱:異步網(wǎng)絡(luò)應(yīng)用程序處理方法
技術(shù)領(lǐng)域:
本發(fā)明涉及網(wǎng)絡(luò)通信技術(shù),尤其涉及一種異步網(wǎng)絡(luò)應(yīng)用程序處理方法。
背景技術(shù):
異步網(wǎng)絡(luò)應(yīng)用,是指當(dāng)發(fā)起一個(gè)線程的調(diào)度后,調(diào)用者并不需要等待結(jié)果,而可以去處理其他事件,而執(zhí)行該線程調(diào)用的邏輯單元在完成調(diào)用后,將結(jié)果通過狀態(tài)、消息、或者回調(diào)的方式通知調(diào)用者。而與之相對(duì)的同步網(wǎng)絡(luò)應(yīng)用是指調(diào)用者發(fā)起調(diào)度后,不執(zhí)行其他任務(wù),只等待該調(diào)用的結(jié)果??梢钥闯?,異步網(wǎng)絡(luò)應(yīng)用是一種效率更高的網(wǎng)絡(luò)通信方式。隨著互聯(lián)網(wǎng)的快速發(fā)展,各種異步網(wǎng)絡(luò)應(yīng)用不斷豐富,因此,對(duì)網(wǎng)絡(luò)應(yīng)用軟件的穩(wěn)定性、高效性都提出了越來越高的要求。目前被廣泛應(yīng)用的異步網(wǎng)絡(luò)應(yīng)用程序處理方法有以下幾種:(I)多線程處理方法。在該方法中,對(duì)于服務(wù)器與單個(gè)客戶端之間建立的會(huì)話,對(duì)于服務(wù)器與單個(gè)客戶端之間建立的會(huì)話都建立獨(dú)立的進(jìn)程/線程進(jìn)行處理。因此,這種方法將創(chuàng)建大量的進(jìn)程/線程,從而消耗大量的系統(tǒng)資源,而且,眾多線程之間的同步和切換也會(huì)導(dǎo)致系統(tǒng)效率的大幅下降。(2)單線程處理方法。在該方法中,以單一的線程來處理所有的網(wǎng)絡(luò)會(huì)話的相關(guān)運(yùn)算。即所有網(wǎng)絡(luò)相關(guān)操作,都由一個(gè)線程,通過操作系統(tǒng)支持的多路復(fù)用技術(shù),實(shí)現(xiàn)對(duì)多會(huì)話網(wǎng)絡(luò)業(yè)務(wù)的并發(fā)支持。這種模型可以節(jié)約系統(tǒng)資源,但其響應(yīng)速度和并發(fā)度都存在不足,應(yīng)用編寫者任何一行不合理的代碼都會(huì)導(dǎo)致整個(gè)系統(tǒng)失去響應(yīng)。(3)線程池處理方法。在該方法中,需要建立有限的多個(gè)線程,所有的網(wǎng)絡(luò)相關(guān)操作,由線程池中的有限個(gè)線程來承載。在所述多個(gè)線程中,設(shè)置一個(gè)管理線程,由所述管理線程來調(diào)度線程池中的其他線程,并且處理各個(gè)事件。例如,當(dāng)一個(gè)管理線程發(fā)現(xiàn)了一個(gè)事件,根據(jù)不同的網(wǎng)絡(luò)應(yīng)用,所述管理線程有可能分配其他線程去處理;或者,該管理線程也可能由自身來處理該事件,即將自身降級(jí)為一般線程,而將其他線程升級(jí)為管理線程??梢钥闯觯捎谶@種線程池處理方法引入了管理線程,使得多個(gè)線程間的線程均衡算法較為復(fù)雜,因此可擴(kuò)展性和可維護(hù)性不強(qiáng)。而且,均衡算法若設(shè)計(jì)得不好,還會(huì)帶來很大的系統(tǒng)開銷。網(wǎng)絡(luò)應(yīng)用程序會(huì)大量地采用定時(shí)器,在現(xiàn)有的應(yīng)用中,很多程序會(huì)以一個(gè)或多個(gè)線程固定作為定時(shí)器的超時(shí)處理線程,即為了定時(shí)器而新建線程,這會(huì)引起系統(tǒng)性能的大幅下降,在定時(shí)器的易用性和高效性上都會(huì)存在很大問題。另外,在一個(gè)網(wǎng)絡(luò)應(yīng)用中,應(yīng)用內(nèi)部的邏輯對(duì)象之間需要大量的通信。例如:邏輯對(duì)象A需要調(diào)用邏輯對(duì)象B執(zhí)行一個(gè)持續(xù)時(shí)長(zhǎng)不確定的事務(wù),而對(duì)象B在執(zhí)行完畢后,需要通知對(duì)象A。在現(xiàn)有的很多實(shí)現(xiàn)中,這一般通過如下方式來實(shí)現(xiàn):對(duì)象A在調(diào)用對(duì)象B時(shí),傳給B —個(gè)指向某個(gè)屬于A的函數(shù)的指針,當(dāng)對(duì)象B完成事務(wù)后,通過這個(gè)指針調(diào)用對(duì)象A的某個(gè)函數(shù),從而達(dá)到通知對(duì)象A的目的。在這種實(shí)現(xiàn)方式中,指針只有通信的對(duì)象雙方知悉,通信也只在對(duì)象雙方進(jìn)行,系統(tǒng)的線程并未參與對(duì)通信內(nèi)容、通信過程的管理,一旦對(duì)象的雙方或一方注銷,就會(huì)發(fā)生通信內(nèi)容的丟失甚至程序失敗,這會(huì)危及整個(gè)系統(tǒng)的安全,也不利于網(wǎng)絡(luò)應(yīng)用程序的維護(hù)和擴(kuò)展。
發(fā)明內(nèi)容
針對(duì)現(xiàn)有技術(shù)的缺陷,本發(fā)明的目的是提供一種能夠簡(jiǎn)便地實(shí)現(xiàn)線程和事件管理的異步網(wǎng)絡(luò)應(yīng)用程序處理方法。本發(fā)明提供的異步網(wǎng)絡(luò)應(yīng)用程序處理方法包括:a.建立多個(gè)線程,其中各個(gè)線程具有相同的運(yùn)行邏輯;b.其中一個(gè)線程獲得全局鎖,從而獲得對(duì)事件隊(duì)列的處理權(quán);c.具有事件隊(duì)列處理權(quán)的線程查詢待處理事件隊(duì)列,當(dāng)待處理事件隊(duì)列中存在待處理事件時(shí),則該線程讀取一個(gè)待處理事件,以便對(duì)該待處理事件進(jìn)行處理;當(dāng)待處理事件隊(duì)列中不存在待處理事件時(shí),則該線程對(duì)事件列表進(jìn)行監(jiān)測(cè),當(dāng)該線程監(jiān)測(cè)到事件時(shí),將所述事件加入待處理事件隊(duì)列;d.在出現(xiàn)以下三種情況的任何一種時(shí),當(dāng)前獲得所述處理權(quán)的線程退出全局鎖,由所有線程競(jìng)爭(zhēng)全局鎖,并執(zhí)行步驟b: (I)當(dāng)前獲得所述處理權(quán)的線程讀取一個(gè)待處理事件后退出全局鎖,并且在處理完該事件后與其他線程競(jìng)爭(zhēng)全局鎖;(2)當(dāng)前獲得所述處理權(quán)的線程將事件列表中的事件都加入待處理事件隊(duì)列;(3)當(dāng)前獲得所述處理權(quán)的線程對(duì)事件列表完成了一個(gè)線程循環(huán)周期的監(jiān)測(cè)。優(yōu)選地,步驟c包括:cll.對(duì)定時(shí)器事件進(jìn)行監(jiān)測(cè);cl2.在一次監(jiān)測(cè)完成之前,計(jì)算所有定時(shí)器各自距下次超時(shí)的時(shí)間差,當(dāng)一個(gè)定時(shí)器的時(shí)間差小于定時(shí)器的最小精度時(shí),則該定時(shí)器到期,具有事件隊(duì)列處理權(quán)的線程將其轉(zhuǎn)換成超時(shí)事件,并將該超時(shí)事件加入待處理事件隊(duì)列;cl3.具有事件隊(duì)列處理權(quán)的線程查詢所述待處理事件隊(duì)列,當(dāng)待處理事件隊(duì)列中存在超時(shí)事件時(shí),則該線程對(duì)所述超時(shí)事件進(jìn)行處理;當(dāng)待處理事件隊(duì)列中不存在待處理事件時(shí),則該線程對(duì)事件列表進(jìn)行監(jiān)測(cè),當(dāng)該線程監(jiān)測(cè)到超時(shí)事件時(shí),將超時(shí)事件加入待處理事件隊(duì)列。優(yōu)選地,步驟cll還包括,具有事件隊(duì)列處理權(quán)的線程找出所有定時(shí)器的最小到期時(shí)間,以所述最小到期時(shí)間和最小線程循環(huán)周期中的最小值為監(jiān)測(cè)周期,對(duì)定時(shí)器事件進(jìn)行監(jiān)測(cè)。優(yōu)選地,本發(fā)明的異步網(wǎng)絡(luò)應(yīng)用程序處理方法還包括:將定時(shí)器事件從監(jiān)測(cè)的事件中刪除,以實(shí)現(xiàn)對(duì)定時(shí)器的注銷。優(yōu)選地,多個(gè)線程隨機(jī)地獲得全局鎖。優(yōu)選地,步驟c還包括以下步驟:c21.當(dāng)一個(gè)源對(duì)象需要發(fā)送消息時(shí),則所述源對(duì)象通過異步消息發(fā)送接口向目的對(duì)象發(fā)送消息,同時(shí),源對(duì)象在消息隊(duì)列中記錄異步消息記錄項(xiàng);c22.具有事件隊(duì)列處理權(quán)的線程根據(jù)接收到的告知信息從消息隊(duì)列中接收異步消息記錄項(xiàng);c23.根據(jù)所述記錄項(xiàng)讀取記錄的內(nèi)容,所述具有事件隊(duì)列處理權(quán)的線程將異步消息記錄項(xiàng)轉(zhuǎn)換成待處理的異步消息事件,并將所述異步消息事件加入待處理事件隊(duì)列。優(yōu)選地,步驟c21包括:當(dāng)僅有該源對(duì)象向消息隊(duì)列發(fā)送了異步消息記錄項(xiàng)時(shí),則在該源對(duì)象向消息隊(duì)列發(fā)送異步消息記錄項(xiàng)的同時(shí),該源對(duì)象向具有事件隊(duì)列處理權(quán)的線程發(fā)送告知信息。優(yōu)選地,源對(duì)象通過特定的管道向具有事件隊(duì)列處理權(quán)的線程發(fā)送告知信息。
優(yōu)選地,所述特定的管道是命名通道、文件句柄或套接字。優(yōu)選地,所述異步消息記錄項(xiàng)包括源對(duì)象ID、目的對(duì)象ID、消息內(nèi)容。相對(duì)于現(xiàn)有技術(shù),本發(fā)明的異步網(wǎng)絡(luò)應(yīng)用程序處理方法,通過建立多個(gè)等效的線程以及多個(gè)線程之間對(duì)全局鎖的競(jìng)鎖邏輯,實(shí)現(xiàn)了對(duì)多線程簡(jiǎn)潔、高效的管理,節(jié)約了軟硬件資源,簡(jiǎn)化的異步網(wǎng)絡(luò)應(yīng)用程序的處理算法。進(jìn)一步的,本發(fā)明還在上述線程調(diào)度的基礎(chǔ)上提供了相應(yīng)的定時(shí)器事件管理方法,通過簡(jiǎn)潔的線程模型進(jìn)行超時(shí)處理,從而在不引入其他資源情況下,實(shí)現(xiàn)了輕量級(jí)的定時(shí)器機(jī)制。而且,本發(fā)明還在上述線程調(diào)度的基礎(chǔ)上實(shí)現(xiàn)了一種對(duì)象之間的通信管理方法,通過線程對(duì)通信雙方消息交互的處理,保證了對(duì)象之間通信的安全性,使得異步網(wǎng)絡(luò)應(yīng)用程序的運(yùn)行更加穩(wěn)定。
圖1是本發(fā)明一種具體實(shí)施方式
的異步網(wǎng)絡(luò)應(yīng)用程序處理方法的流程圖。
具體實(shí)施例方式如圖1所示,本發(fā)明一種具體實(shí)施方式
的異步網(wǎng)絡(luò)應(yīng)用處理方法包括以下步驟:在步驟101,建立多個(gè)線程。所建立的多個(gè)線程具有等同的運(yùn)行邏輯,S卩,各個(gè)線程之間的地位是平等的,不存在對(duì)于其他線程具有管理支配功能的管理線程,各線程相互為等效線程。線程對(duì)事件的處理執(zhí)行,線程通過獲得全局鎖來獲得對(duì)事件的處理權(quán)。線程的建立可以通過應(yīng)用程序接口來完成。全局鎖具有互斥的特性,S卩,任意時(shí)刻只有一個(gè)邏輯模塊能獲得鎖,從而任意時(shí)刻只有一個(gè)邏輯模塊能獲得鎖的線程即獲得隊(duì)列的處理權(quán)。在本發(fā)明中,所述邏輯模塊可以是步驟101中建立的多個(gè)線程中的任意一個(gè)。建立線程可以通過各種適合的編程手段來實(shí)現(xiàn),例如,在程序的主函數(shù)內(nèi),通過應(yīng)用程序接口建立多個(gè)線程,用戶通過應(yīng)用程序接口的參數(shù),傳入系統(tǒng)希望建立的線程個(gè)數(shù)。對(duì)于多CPU的計(jì)算機(jī)系統(tǒng),為了更好的利用多CPU資源,線程的個(gè)數(shù)優(yōu)選為大于或等于參數(shù)值、且是CPU個(gè)數(shù)的整數(shù)倍數(shù)。考慮到線程所占系統(tǒng)資源,以及多線程調(diào)度可能加劇線程切換等問題,本發(fā)明可以將線程最大個(gè)數(shù)設(shè)置為32個(gè),但也可視系統(tǒng)具體情況而作調(diào)整。所有線程針對(duì)的是一個(gè)由一個(gè)全局鎖保護(hù)的列表,即事件隊(duì)列。該事件隊(duì)列記錄了相關(guān)的對(duì)象和需要關(guān)注的事件集合。通過對(duì)全局鎖的競(jìng)爭(zhēng),多個(gè)等效線程中的某一個(gè)獲得此全局鎖,即取得了此事件隊(duì)列的處理權(quán)。因此,在步驟102,上述線程中的一個(gè)獲得了全局鎖,從而獲得事件隊(duì)列的處理權(quán)。所有線程對(duì)全局鎖的競(jìng)爭(zhēng)是平等的,即,所有線程隨機(jī)排列,等待獲得全局鎖,在第一個(gè)線程獲得全局鎖后,對(duì)事件隊(duì)列進(jìn)行相關(guān)處理,然后釋放全局鎖,再由下一個(gè)隨機(jī)排列的線程獲得該全局鎖,繼續(xù)對(duì)事件隊(duì)列進(jìn)行處理。在出現(xiàn)以下三種情況的任何一種時(shí),當(dāng)前獲得所述處理權(quán)的線程退出全局鎖,并且重新由所有線程競(jìng)爭(zhēng)獲得全局鎖:第一,當(dāng)前獲得所述處理權(quán)的線程讀取一個(gè)待處理事件后退出全局鎖,并且在處理完該事件后與其他線程競(jìng)爭(zhēng)全局鎖;第二,當(dāng)前獲得所述處理權(quán)的線程將事件列表中事件都加入待處理事件隊(duì)列;第三,當(dāng)前獲得所述處理權(quán)的線程對(duì)事件列表完成了一個(gè)線程循環(huán)周期的監(jiān)測(cè)。在步驟103,具有事件隊(duì)列處理權(quán)的線程查詢待處理事件隊(duì)列,以確定在待處理事件隊(duì)列中是否已經(jīng)存在待處理事件。若在事件隊(duì)列中存在待處理事件,則在步驟104,該線程讀取一個(gè)待處理事件,以便進(jìn)一步驅(qū)動(dòng)與該事件綁定的對(duì)象,調(diào)用對(duì)象實(shí)現(xiàn)的處理函數(shù)處理所述事件,從而完成業(yè)務(wù)邏輯。若待處理事件隊(duì)列為空,即待處理事件隊(duì)列中沒有待處理事件,則在步驟105,該線程進(jìn)行事件列表的監(jiān)測(cè),以收集待處理事件集。綜上所述,所建立的多個(gè)等效線程,優(yōu)先進(jìn)行待處理事件的處理工作,若具有待處理事件隊(duì)列處理權(quán)的線程發(fā)現(xiàn)沒有待處理事件時(shí),則進(jìn)行事件監(jiān)測(cè)。在步驟106,當(dāng)具有待處理事件隊(duì)列處理權(quán)的線程監(jiān)測(cè)到事件時(shí),將所述事件加入待處理事件隊(duì)列。在上述對(duì)線程的調(diào)度方法的基礎(chǔ)上,本發(fā)明還提供了兩種重要的應(yīng)用:一種是對(duì)定時(shí)器的管理;另一種是對(duì)于對(duì)象之間通信的管理。在具體采用C++語言編程實(shí)現(xiàn)上述異步網(wǎng)絡(luò)應(yīng)用程序處理方法的時(shí)候,可以進(jìn)行如下處理:提供一個(gè)C++基類,如命名為CNetHander, CNetHandler的派生類通過該基類提供的事件注冊(cè)接口,注冊(cè)相關(guān)的網(wǎng)絡(luò)、定時(shí)器超時(shí)等事件,并實(shí)現(xiàn)事件對(duì)應(yīng)的回調(diào)函數(shù)。則當(dāng)相關(guān)的事件發(fā)生時(shí),所述事件將被當(dāng)前監(jiān)測(cè)事件隊(duì)列的線程發(fā)現(xiàn),并轉(zhuǎn)換成待處理事件,再由該線程或者其他線程獲取,驅(qū)動(dòng)此事件綁定的對(duì)象,調(diào)用對(duì)象實(shí)現(xiàn)的回調(diào)函數(shù),即可在回調(diào)函數(shù)中實(shí)現(xiàn)業(yè)務(wù)邏輯。由于網(wǎng)絡(luò)應(yīng)用本身的特殊性,通常會(huì)大量使用定時(shí)器,定時(shí)器也可以作為一種待處理的事件。在本發(fā)明的一種優(yōu)選實(shí)施方式中,對(duì)定時(shí)器的管理過程如下:I)建立多個(gè)線程,所建立的多個(gè)線程具有等同的運(yùn)行邏輯。2)通過獲得全局鎖而得到事件隊(duì)列處理權(quán)的某個(gè)線程,對(duì)事件隊(duì)列進(jìn)行查詢。具有事件隊(duì)列處理權(quán)的線程查找在事件隊(duì)列中是否存在待處理事件。若在事件隊(duì)列中存在待處理事件,則該線程驅(qū)動(dòng)與該事件綁定的對(duì)象,調(diào)用對(duì)象實(shí)現(xiàn)的處理函數(shù)處理所述事件,從而完成業(yè)務(wù)邏輯;若事件列表為空,即事件列表中沒有待處理事件,則該線程進(jìn)行事件列表的監(jiān)測(cè),以收集待處理事件集。3)在網(wǎng)絡(luò)應(yīng)用的業(yè)務(wù)邏輯需要使用定時(shí)器時(shí),可以通過應(yīng)用程序接口(例如前述CNetHandler類的對(duì)象)的定時(shí)器創(chuàng)建接口,創(chuàng)建一個(gè)或多個(gè)定時(shí)器,此時(shí)定時(shí)器成為待監(jiān)測(cè)事件。4)當(dāng)具有事件隊(duì)列處理權(quán)的線程發(fā)現(xiàn)事件隊(duì)列中有定時(shí)器超時(shí)事件,則進(jìn)行處理,例如由所述線程調(diào)用相應(yīng)對(duì)象的超時(shí)處理函數(shù),以實(shí)現(xiàn)超時(shí)處理邏輯。當(dāng)具有事件隊(duì)列處理權(quán)的線程發(fā)現(xiàn)事件隊(duì)列中沒有待處理事件時(shí),則開始監(jiān)測(cè)事件。具體地,找到所有定時(shí)器中的最小到期時(shí)間,以最小到期時(shí)間和線程最小循環(huán)時(shí)間中的最小值為監(jiān)測(cè)超時(shí)時(shí)間,進(jìn)行事件監(jiān)測(cè)。所述監(jiān)測(cè)超時(shí)時(shí)間即進(jìn)行一次監(jiān)測(cè)的周期。5)在線程監(jiān)測(cè)超時(shí)之前,無論有沒有待處理事件出現(xiàn),在監(jiān)測(cè)完成時(shí)更新各定時(shí)器距下次超時(shí)的時(shí)間差,所述時(shí)間差即用定時(shí)器的到期時(shí)間減去線程最小循環(huán)之后的差值,若時(shí)間差已經(jīng)小于定時(shí)器的最小精度,則該定時(shí)器到期,負(fù)責(zé)監(jiān)測(cè)的線程將其轉(zhuǎn)換成超時(shí)事件,加入待處理的事件隊(duì)列。例如:在當(dāng)前時(shí)刻,定時(shí)器的精度為1ms,線程最小循環(huán)時(shí)間為5ms,定時(shí)器的到期時(shí)間為10ms,定時(shí)器距下次超時(shí)的時(shí)間差為5ms,因此定時(shí)器尚未超時(shí);而當(dāng)定時(shí)器的到期時(shí)間還剩5ms時(shí),定時(shí)器距下次超時(shí)的時(shí)間差為0ms,因此此時(shí)定時(shí)器已超時(shí)。6)具有事件隊(duì)列處理權(quán)的線程在讀取待處理事件時(shí),如果讀取到超時(shí)事件,則進(jìn)行超時(shí)處理,例如:通過回調(diào)函數(shù)調(diào)度,觸發(fā)對(duì)象的超時(shí)處理流程。7)若需要注銷定時(shí)器,則通過應(yīng)用程序接口(例如前述CNetHandler類的對(duì)象提供的定時(shí)器注銷接口),將定時(shí)器從待監(jiān)測(cè)事件隊(duì)列中刪除,從而完成定時(shí)器注銷。在本發(fā)明的另一種優(yōu)選實(shí)施方式中,基于所描述的線程處理方法,實(shí)現(xiàn)對(duì)象之間通信的管理,具體過程如下:(i)建立多個(gè)線程,所建立的多個(gè)線程具有等同的運(yùn)行邏輯。(ii)通過獲得全局鎖而得到事件隊(duì)列處理權(quán)的某個(gè)線程,對(duì)事件隊(duì)列進(jìn)行查詢。若在事件隊(duì)列中存在異步消息事件,則該線程驅(qū)動(dòng)與該事件綁定的對(duì)象,調(diào)用對(duì)象實(shí)現(xiàn)的處理函數(shù)處理所述事件,從而完成業(yè)務(wù)邏輯;若事件隊(duì)列為空,即事件隊(duì)列中沒有待處理事件,則該線程進(jìn)行事件列表的監(jiān)測(cè),以收集待處理事件集。(iii)若一個(gè)源對(duì)象A (例如CNetHandler派生類對(duì)象)需要發(fā)送消息,則通過異步消息發(fā)送接口(例如CNetHandler派生類的父類消息發(fā)送接口),向目的對(duì)象B發(fā)送消息。CNetHandler派生類所創(chuàng)建的對(duì)象可以獲取統(tǒng)一分配的唯一對(duì)象ID,所以此類對(duì)象可以通過這個(gè)ID進(jìn)行異步消息的發(fā)送和接收,實(shí)現(xiàn)相互間的通訊。同時(shí),源對(duì)象A在消息隊(duì)列中記錄一個(gè)異步消息記錄項(xiàng),該記錄項(xiàng)記錄了消息源為A的對(duì)象ID,消息目的為B的對(duì)象ID,以及消息內(nèi)容。在一種具體實(shí)施方式
中,消息發(fā)送接口可以首先將消息轉(zhuǎn)換成消息項(xiàng),將所述消息項(xiàng)記錄在消息隊(duì)列中。優(yōu)選地,在源對(duì)象通過異步消息發(fā)送接口提交異步消息記錄項(xiàng)時(shí),若發(fā)現(xiàn)當(dāng)前事件隊(duì)列中沒有其它待處理的異步消息提交項(xiàng),則需要告知具有事件隊(duì)列處理權(quán)的線程當(dāng)前有異步消息需要處理。具體地,源對(duì)象通過異步消息發(fā)送接口查看消息隊(duì)列的長(zhǎng)度,若消息隊(duì)列長(zhǎng)度為1,則說明僅有這一個(gè)待發(fā)送消息,因此需要告知目前得到待處理隊(duì)列處理權(quán)的線程及時(shí)獲取該消息??梢栽谙到y(tǒng)初始化時(shí)創(chuàng)建一個(gè)管道來實(shí)現(xiàn)所述告知過程,將該管道的讀端加入事件隊(duì)列,以監(jiān)測(cè)管道的可讀事件[11],當(dāng)消息隊(duì)列長(zhǎng)度為I時(shí),向所述管道中寫入一段信息(例如一個(gè)字節(jié)),以告知目前具有待處理隊(duì)列處理權(quán)的線程。所述管道可以利用C++語言中的命名管道、文件句柄或套接字來實(shí)現(xiàn)。若源對(duì)象發(fā)起異步消息時(shí),消息隊(duì)列中已經(jīng)存在待監(jiān)測(cè)轉(zhuǎn)換的消息項(xiàng),說明目前具有待處理隊(duì)列處理權(quán)的線程正在處理異步消息,則源對(duì)象僅需提交異步消息項(xiàng),等待所述異步消息項(xiàng)被線程處理。(iv)具有事件隊(duì)列處理權(quán)的線程接收到異步消息記錄項(xiàng)后,根據(jù)所述記錄項(xiàng)讀取記錄的內(nèi)容,將其轉(zhuǎn)換成一個(gè)待處理的異步消息事件,直到記錄項(xiàng)列表中所有異步消息記錄項(xiàng)都被轉(zhuǎn)換成待處理的異步消息事件,并將所述異步消息事件加入事件隊(duì)列。(V)具有事件隊(duì)列處理權(quán)的線程從事件隊(duì)列中讀取所述異步消息事件,以便該異步消息事件進(jìn)行處理。例如,通過回調(diào)函數(shù)觸發(fā)消息處理流程。若對(duì)象A在向?qū)ο驜發(fā)送了一個(gè)異步消息后,在消息到達(dá)對(duì)象B之前,對(duì)象B被銷毀了,則線程在處理該異步消息時(shí),就無法通過ID找到對(duì)象B,線程就會(huì)對(duì)該消息作丟棄處理,所以對(duì)整個(gè)系統(tǒng)不會(huì)產(chǎn)生任何危害。同樣的,若對(duì)象A在向?qū)ο驜發(fā)送了一個(gè)異步消息后,在消息到達(dá)對(duì)象B之前,對(duì)象A被銷毀了,那么該消息還是會(huì)安全地到達(dá)對(duì)象B并被正確處理,只是,若此時(shí)對(duì)象B要向?qū)ο驛回復(fù)消息,則該消息會(huì)被線程丟棄。因此,在本發(fā)明在異步消息的傳遞過程中,無論通信的對(duì)象雙方發(fā)生了怎樣的變化,通信始終是安全的、無害的。盡管本發(fā)明是通過上述的優(yōu)選實(shí)施方式進(jìn)行描述的,但是其實(shí)現(xiàn)形式并不局限于上述的實(shí)施方式。應(yīng)該認(rèn)識(shí)到:在不脫離本發(fā)明主旨的情況下,本領(lǐng)域技術(shù)人員可以對(duì)本發(fā)明做出不同的變化和修改。
權(quán)利要求
1.一種異步網(wǎng)絡(luò)應(yīng)用程序處理方法,其特征在于,所述方法包括: a.建立多個(gè)線程,其中各個(gè)線程具有相同的運(yùn)行邏輯; b.其中一個(gè)線程獲得全局鎖,從而獲得對(duì)事件隊(duì)列的處理權(quán); c.具有事件隊(duì)列處理權(quán)的線程查詢待處理事件隊(duì)列,當(dāng)待處理事件隊(duì)列中存在待處理事件時(shí),則該線程讀取一個(gè)待處理事件,以便對(duì)該待處理事件進(jìn)行處理;當(dāng)待處理事件隊(duì)列中不存在待處理事件時(shí),則該線程對(duì)事件列表進(jìn)行監(jiān)測(cè),當(dāng)該線程監(jiān)測(cè)到事件時(shí),將所述事件加入待處理事件隊(duì)列; d.在出現(xiàn)以下三種情況的任何一種時(shí),當(dāng)前獲得所述處理權(quán)的線程退出全局鎖,由所有線程競(jìng)爭(zhēng)全局鎖,并執(zhí)行步驟b: (I)當(dāng)前獲得所述處理權(quán)的線程讀取一個(gè)待處理事件后退出全局鎖,并且在處理完該事件后與其他線程競(jìng)爭(zhēng)全局鎖;(2)當(dāng)前獲得所述處理權(quán)的線程將監(jiān)測(cè)到的事件都加入待處理事件隊(duì)列;(3)當(dāng)前 獲得所述處理權(quán)的線程對(duì)事件列表完成了一個(gè)線程循環(huán)周期的監(jiān)測(cè)。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,步驟c包括: cll.對(duì)定時(shí)器事件進(jìn)行監(jiān)測(cè); cl2.在一次監(jiān)測(cè)完成之前,計(jì)算所有定時(shí)器各自距下次超時(shí)的時(shí)間差,當(dāng)一個(gè)定時(shí)器的時(shí)間差小于定時(shí)器的最小精度時(shí),則該定時(shí)器到期,具有事件隊(duì)列處理權(quán)的線程將其轉(zhuǎn)換成超時(shí)事件,并將該超時(shí)事件加入待處理事件隊(duì)列; cl3.具有事件隊(duì)列處理權(quán)的線程查詢所述待處理事件隊(duì)列,當(dāng)待處理事件隊(duì)列中存在超時(shí)事件時(shí),則該線程對(duì)所述超時(shí)事件進(jìn)行處理;當(dāng)待處理事件隊(duì)列中不存在待處理事件時(shí),則該線程對(duì)事件列表進(jìn)行監(jiān)測(cè),當(dāng)該線程監(jiān)測(cè)到超時(shí)事件時(shí),將超時(shí)事件加入待處理事件隊(duì)列。
3.根據(jù)權(quán)利要求2所述的方法,其特征在于,步驟cll還包括,具有事件隊(duì)列處理權(quán)的線程找出所有定時(shí)器的最小到期時(shí)間,以所述最小到期時(shí)間和最小線程循環(huán)周期中的最小值為監(jiān)測(cè)周期,對(duì)定時(shí)器事件進(jìn)行監(jiān)測(cè)。
4.根據(jù)權(quán)利要求2所述的方法,其特征在于,所述方法還包括:將定時(shí)器事件從監(jiān)測(cè)的事件中刪除,以實(shí)現(xiàn)對(duì)定時(shí)器的注銷。
5.根據(jù)權(quán)利要求1所述的方法,其特征在于,多個(gè)線程隨機(jī)地獲得全局鎖。
6.根據(jù)權(quán)利要求1或2所述的方法,其特征在于,步驟c還包括以下步驟: c21.當(dāng)一個(gè)源對(duì)象需要發(fā)送消息時(shí),則所述源對(duì)象通過異步消息發(fā)送接口向目的對(duì)象發(fā)送消息,同時(shí),源對(duì)象在消息隊(duì)列中記錄異步消息記錄項(xiàng); c22.具有事件隊(duì)列處理權(quán)的線程根據(jù)接收到的告知信息從消息隊(duì)列中接收異步消息記錄項(xiàng); c23.根據(jù)所述記錄項(xiàng)讀取記錄的內(nèi)容,所述具有事件隊(duì)列處理權(quán)的線程將所有異步消息記錄項(xiàng)轉(zhuǎn)換成待處理的異步消息事件,并將所述異步消息事件加入待處理事件隊(duì)列。
7.根據(jù)權(quán)利要求6所述的方法,其特征在于,步驟c21包括:當(dāng)僅有該源對(duì)象向消息隊(duì)列發(fā)送了異步消息記錄項(xiàng)時(shí),則在該源對(duì)象向消息隊(duì)列發(fā)送異步消息記錄項(xiàng)的同時(shí),該源對(duì)象向具有事件隊(duì)列處理權(quán)的線程發(fā)送告知信息。
8.根據(jù)權(quán)利要求7所述的方法,其特征在于,源對(duì)象通過特定的管道向具有事件隊(duì)列處理權(quán)的線程發(fā)送告知信息。
9.根據(jù)權(quán)利要求8所述的方法,其特征在于,所述特定的管道是命名管道、文件句柄或套接字。
10.根據(jù)權(quán)利要求6所述的方法,其特征在于,所述異步消息記錄項(xiàng)包括源對(duì)象ID、目的對(duì)象ID、消息內(nèi)容 。
全文摘要
本發(fā)明公開的異步網(wǎng)絡(luò)應(yīng)用程序處理方法包括建立多個(gè)線程,其中各個(gè)線程具有相同的運(yùn)行邏輯;其中一個(gè)線程獲得全局鎖,從而獲得對(duì)事件隊(duì)列的處理權(quán);具有事件隊(duì)列處理權(quán)的線程查詢待處理事件隊(duì)列,當(dāng)待處理事件隊(duì)列中存在待處理事件時(shí),則該線程讀取一個(gè)待處理事件,以便對(duì)該待處理事件進(jìn)行處理;當(dāng)待處理事件隊(duì)列中不存在待處理事件時(shí),則該線程對(duì)事件列表進(jìn)行監(jiān)測(cè),當(dāng)該線程監(jiān)測(cè)到事件時(shí),將所述事件加入待處理事件隊(duì)列。本發(fā)明通過建立多個(gè)等效的線程以及多個(gè)線程之間對(duì)全局鎖的競(jìng)鎖邏輯,實(shí)現(xiàn)了對(duì)多線程簡(jiǎn)潔、高效的管理,節(jié)約了軟硬件資源,通過簡(jiǎn)潔的線程模型進(jìn)行超時(shí)處理,實(shí)現(xiàn)了輕量級(jí)的定時(shí)器機(jī)制和安全高效的異步消息機(jī)制。
文檔編號(hào)G06F9/46GK103092682SQ20111033547
公開日2013年5月8日 申請(qǐng)日期2011年10月28日 優(yōu)先權(quán)日2011年10月28日
發(fā)明者何林強(qiáng), 周明偉, 張興明, 傅利泉, 朱江明, 吳軍, 吳堅(jiān) 申請(qǐng)人:浙江大華技術(shù)股份有限公司