一種基于任務(wù)分解的并行任務(wù)處理方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及計(jì)算機(jī)應(yīng)用領(lǐng)域,尤其涉及并行任務(wù)處理領(lǐng)域。
【背景技術(shù)】
[0002]圖1為基于線程的串行任務(wù)處理模型。為了不阻塞任務(wù)讀取線程,向線程池申請(qǐng)一個(gè)獨(dú)立線程進(jìn)行任務(wù)處理,任務(wù)持行完成后,將其歸還線程池重用。
[0003]這種任務(wù)處理模型雖然實(shí)現(xiàn)了任務(wù)的并發(fā)處理,但當(dāng)任務(wù)包括多個(gè)其他類型的子任務(wù)時(shí),工作線程只能對(duì)子任務(wù)進(jìn)行順序處理。串行任務(wù)處理模型主要有以下缺點(diǎn):
(I)并發(fā)量較高時(shí),線程池必須為每個(gè)觸發(fā)事件分配一個(gè)線程,線程上下文的切換、內(nèi)存同步等都將引入額外開(kāi)銷。
[0004](2)需要開(kāi)發(fā)者了解任務(wù)處理的細(xì)節(jié),設(shè)計(jì)專一化的類結(jié)構(gòu),不符合面向?qū)ο蠛驮O(shè)計(jì)模式的程序設(shè)計(jì)思想,不利于業(yè)務(wù)的更新和維護(hù)。
【發(fā)明內(nèi)容】
[0005]本發(fā)明的目的在于針對(duì)現(xiàn)有技術(shù)的問(wèn)題,提供一種基于任務(wù)分解的并行任務(wù)處理方法。
[0006]本發(fā)明的目的是通過(guò)以下技術(shù)方案來(lái)實(shí)現(xiàn)的:一種基于任務(wù)分解的并行任務(wù)處理方法,包括以下步驟:
(1)創(chuàng)建任務(wù)分解隊(duì)列、任務(wù)分配隊(duì)列、響應(yīng)過(guò)濾隊(duì)列以及各類任務(wù)處理隊(duì)列;所述任務(wù)分解隊(duì)列、任務(wù)分配隊(duì)列、響應(yīng)過(guò)濾隊(duì)列以及各類任務(wù)處理隊(duì)列均基于阻塞隊(duì)列實(shí)現(xiàn);
(2)創(chuàng)建任務(wù)分解線程、任務(wù)分配線程、響應(yīng)過(guò)濾線程組以及各類任務(wù)處理線程組;
(3)任務(wù)分解線程從任務(wù)分解隊(duì)列中獲得任務(wù)對(duì)象,根據(jù)任務(wù)對(duì)象的任務(wù)編碼進(jìn)行子任務(wù)分解,并將子任務(wù)存入任務(wù)哈希表,分解完成后,將任務(wù)對(duì)象存入任務(wù)分配隊(duì)列;所述任務(wù)對(duì)象由任務(wù)編碼、任務(wù)參數(shù)和任務(wù)哈希表構(gòu)成;所述任務(wù)哈希表以任務(wù)名為key,任務(wù)項(xiàng)為value ;任務(wù)項(xiàng)包括任務(wù)參數(shù)、任務(wù)狀態(tài)和下級(jí)任務(wù);任務(wù)狀態(tài)標(biāo)識(shí)符分為:has_neXt(存在下級(jí)任務(wù))和done (所有任務(wù)均處理完成);
(4)任務(wù)分配線程從任務(wù)分配隊(duì)列中讀取任務(wù)對(duì)象,根據(jù)任務(wù)哈希表中的任務(wù)名,將任務(wù)對(duì)象分別存入對(duì)應(yīng)任務(wù)處理隊(duì)列;
(5)各類任務(wù)處理線程從任務(wù)處理隊(duì)列中獲得任務(wù)對(duì)象進(jìn)行處理,任務(wù)完成后,存儲(chǔ)任務(wù)響應(yīng),更新任務(wù)狀態(tài)標(biāo)識(shí)符,將任務(wù)對(duì)象插入到響應(yīng)過(guò)濾隊(duì)列;
所述任務(wù)響應(yīng)的存儲(chǔ)方式為替換當(dāng)前任務(wù)項(xiàng)中任務(wù)參數(shù);所述更新任務(wù)狀態(tài)標(biāo)識(shí)符具體為:任務(wù)處理線程判斷下級(jí)任務(wù)字段是否為空,若不為空,則用下級(jí)任務(wù)名替換當(dāng)前任務(wù)名,更新任務(wù)狀態(tài)標(biāo)識(shí)符為haS_next,并將任務(wù)對(duì)象插入下級(jí)任務(wù)對(duì)應(yīng)的任務(wù)處理隊(duì)列;若下級(jí)任務(wù)字段為空,則將任務(wù)狀態(tài)標(biāo)識(shí)符更新為done,并將任務(wù)對(duì)象存入響應(yīng)過(guò)濾隊(duì)列;
(6)響應(yīng)過(guò)濾線程從響應(yīng)過(guò)濾隊(duì)列中獲取任務(wù)對(duì)象,判斷任務(wù)哈希表中每一個(gè)任務(wù)項(xiàng)的任務(wù)狀態(tài)標(biāo)識(shí)符是否為done,若有任務(wù)狀態(tài)不為done,則刪除該任務(wù)對(duì)象,等待所有子任務(wù)處理完成;若所有任務(wù)狀態(tài)均為done,則根據(jù)任務(wù)編碼和子任務(wù)響應(yīng)構(gòu)建整體任務(wù)響應(yīng),完成任務(wù)的并發(fā)處理。
[0007]本發(fā)明方法具有如下特點(diǎn):
(I)當(dāng)業(yè)務(wù)的多個(gè)子任務(wù)不具有順序相關(guān)性時(shí),可將其同時(shí)插入多個(gè)隊(duì)列,進(jìn)行子任務(wù)的并行化處理。
[0008](2)事件觸發(fā)對(duì)象不需要經(jīng)由多個(gè)隊(duì)列的順序傳遞,對(duì)象插入哪個(gè)對(duì)列是由對(duì)象自身的狀態(tài)參量決定的,線程不需要了解它所操作的對(duì)象從哪個(gè)任務(wù)隊(duì)列傳遞過(guò)來(lái),將要進(jìn)入哪個(gè)任務(wù)隊(duì)列,只需完成自身的任務(wù)處理。事件觸發(fā)對(duì)象、任務(wù)隊(duì)列和線程不相互影響,便于類的封裝。
[0009](3)為各類任務(wù)分配固定數(shù)量的處理線程組,無(wú)需為每個(gè)對(duì)象創(chuàng)建一個(gè)專用線程。
【附圖說(shuō)明】
[0010]圖1基于線程的串行任務(wù)處理模型;
圖2基于任務(wù)分解的并行任務(wù)處理。
【具體實(shí)施方式】
[0011]下面結(jié)合附圖和具體實(shí)施例對(duì)本發(fā)明作進(jìn)一步詳細(xì)說(shuō)明。
[0012]本發(fā)明一種基于任務(wù)分解的并行任務(wù)處理方法,包括以下步驟:
(1)創(chuàng)建任務(wù)分解隊(duì)列、任務(wù)分配隊(duì)列、響應(yīng)過(guò)濾隊(duì)列以及各類任務(wù)處理隊(duì)列;所述任務(wù)分解隊(duì)列、任務(wù)分配隊(duì)列、響應(yīng)過(guò)濾隊(duì)列以及各類任務(wù)處理隊(duì)列均基于阻塞隊(duì)列實(shí)現(xiàn);
(2)創(chuàng)建任務(wù)分解線程、任務(wù)分配線程、響應(yīng)過(guò)濾線程組以及各類任務(wù)處理線程組;
(3)任務(wù)分解線程從任務(wù)分解隊(duì)列中獲得任務(wù)對(duì)象,根據(jù)任務(wù)對(duì)象的任務(wù)編碼進(jìn)行子任務(wù)分解,并將子任務(wù)存入任務(wù)哈希表,分解完成后,將任務(wù)對(duì)象存入任務(wù)分配隊(duì)列;所述任務(wù)對(duì)象由任務(wù)編碼、任務(wù)參數(shù)和任務(wù)哈希表構(gòu)成;所述任務(wù)哈希表以任務(wù)名為key,任務(wù)項(xiàng)為value ;任務(wù)項(xiàng)包括任務(wù)參數(shù)、任務(wù)狀態(tài)和下級(jí)任務(wù);任務(wù)狀態(tài)標(biāo)識(shí)符分為:has_neXt(存在下級(jí)任務(wù))和done (所有任務(wù)均處理完成);
(4)任務(wù)分配線程從任務(wù)分配隊(duì)列中讀取任務(wù)對(duì)象,根據(jù)任務(wù)哈希表中的任務(wù)名,將任務(wù)對(duì)象分別存入對(duì)應(yīng)任務(wù)處理隊(duì)列;
(5)各類任務(wù)處理線程從任務(wù)處理隊(duì)列中獲得任務(wù)對(duì)象進(jìn)行處理,任務(wù)完成后,存儲(chǔ)任務(wù)響應(yīng),更新任務(wù)狀態(tài)標(biāo)識(shí)符,將任務(wù)對(duì)象插入到響應(yīng)過(guò)濾隊(duì)列;
所述任務(wù)響應(yīng)的存儲(chǔ)方式為替換當(dāng)前任務(wù)項(xiàng)中任務(wù)參數(shù);所述更新任務(wù)狀態(tài)標(biāo)識(shí)符具體為:任務(wù)處理線程判斷下級(jí)任務(wù)字段是否為空,若不為空,則用下級(jí)任務(wù)名替換當(dāng)前任務(wù)名,更新任務(wù)狀態(tài)標(biāo)識(shí)符為haS_next,并將任務(wù)對(duì)象插入下級(jí)任務(wù)對(duì)應(yīng)的任務(wù)處理隊(duì)列;若下級(jí)任務(wù)字段為空,則將任務(wù)狀態(tài)標(biāo)識(shí)符更新為done,并將任務(wù)對(duì)象存入響應(yīng)過(guò)濾隊(duì)列;
(6)響應(yīng)過(guò)濾線程從響應(yīng)過(guò)濾隊(duì)列中獲取任務(wù)對(duì)象,判斷任務(wù)哈希表中每一個(gè)任務(wù)項(xiàng)的任務(wù)狀態(tài)標(biāo)識(shí)符是否為done,若有任務(wù)狀態(tài)不為done,則刪除該任務(wù)對(duì)象,等待所有子任務(wù)處理完成;若所有任務(wù)狀態(tài)均為done,則根據(jù)任務(wù)編碼和子任務(wù)響應(yīng)構(gòu)建整體任務(wù)響應(yīng),完成任務(wù)的并發(fā)處理。
[0013]如圖2所示,主線程讀取到待處理任務(wù)后,將其插入任務(wù)隊(duì)列進(jìn)行緩存。任務(wù)隊(duì)列實(shí)現(xiàn)統(tǒng)一的阻塞任務(wù)隊(duì)列接口,即使擴(kuò)展新業(yè)務(wù),也只需要開(kāi)發(fā)新的業(yè)務(wù)子類,對(duì)原有程序結(jié)構(gòu)不造成任何影響。線程池為每個(gè)任務(wù)隊(duì)列分配若干線程,當(dāng)任務(wù)隊(duì)列為空時(shí),線程在隊(duì)列的對(duì)象鎖上阻塞等待,直到隊(duì)列中有新任務(wù),線程被喚起并搶占任務(wù),完成任務(wù)處理。
【主權(quán)項(xiàng)】
1.一種基于任務(wù)分解的并行任務(wù)處理方法,其特征在于,包括以下步驟: (1)創(chuàng)建任務(wù)分解隊(duì)列、任務(wù)分配隊(duì)列、響應(yīng)過(guò)濾隊(duì)列以及各類任務(wù)處理隊(duì)列;所述任務(wù)分解隊(duì)列、任務(wù)分配隊(duì)列、響應(yīng)過(guò)濾隊(duì)列以及各類任務(wù)處理隊(duì)列均基于阻塞隊(duì)列實(shí)現(xiàn); (2)創(chuàng)建任務(wù)分解線程、任務(wù)分配線程、響應(yīng)過(guò)濾線程組以及各類任務(wù)處理線程組; (3)任務(wù)分解線程從任務(wù)分解隊(duì)列中獲得任務(wù)對(duì)象,根據(jù)任務(wù)對(duì)象的任務(wù)編碼進(jìn)行子任務(wù)分解,并將子任務(wù)存入任務(wù)哈希表,分解完成后,將任務(wù)對(duì)象存入任務(wù)分配隊(duì)列;所述任務(wù)對(duì)象由任務(wù)編碼、任務(wù)參數(shù)和任務(wù)哈希表構(gòu)成;所述任務(wù)哈希表以任務(wù)名為key,任務(wù)項(xiàng)為value ;任務(wù)項(xiàng)包括任務(wù)參數(shù)、任務(wù)狀態(tài)和下級(jí)任務(wù);任務(wù)狀態(tài)標(biāo)識(shí)符分為:has_neXt(存在下級(jí)任務(wù))和done (所有任務(wù)均處理完成); (4)任務(wù)分配線程從任務(wù)分配隊(duì)列中讀取任務(wù)對(duì)象,根據(jù)任務(wù)哈希表中的任務(wù)名,將任務(wù)對(duì)象分別存入對(duì)應(yīng)任務(wù)處理隊(duì)列; (5)各類任務(wù)處理線程從任務(wù)處理隊(duì)列中獲得任務(wù)對(duì)象進(jìn)行處理,任務(wù)完成后,存儲(chǔ)任務(wù)響應(yīng),更新任務(wù)狀態(tài)標(biāo)識(shí)符,將任務(wù)對(duì)象插入到響應(yīng)過(guò)濾隊(duì)列; 所述任務(wù)響應(yīng)的存儲(chǔ)方式為替換當(dāng)前任務(wù)項(xiàng)中任務(wù)參數(shù);所述更新任務(wù)狀態(tài)標(biāo)識(shí)符具體為:任務(wù)處理線程判斷下級(jí)任務(wù)字段是否為空,若不為空,則用下級(jí)任務(wù)名替換當(dāng)前任務(wù)名,更新任務(wù)狀態(tài)標(biāo)識(shí)符為haS_next,并將任務(wù)對(duì)象插入下級(jí)任務(wù)對(duì)應(yīng)的任務(wù)處理隊(duì)列;若下級(jí)任務(wù)字段為空,則將任務(wù)狀態(tài)標(biāo)識(shí)符更新為done,并將任務(wù)對(duì)象存入響應(yīng)過(guò)濾隊(duì)列; (6)響應(yīng)過(guò)濾線程從響應(yīng)過(guò)濾隊(duì)列中獲取任務(wù)對(duì)象,判斷任務(wù)哈希表中每一個(gè)任務(wù)項(xiàng)的任務(wù)狀態(tài)標(biāo)識(shí)符是否為done,若有任務(wù)狀態(tài)不為done,則刪除該任務(wù)對(duì)象,等待所有子任務(wù)處理完成;若所有任務(wù)狀態(tài)均為done,則根據(jù)任務(wù)編碼和子任務(wù)響應(yīng)構(gòu)建整體任務(wù)響應(yīng),完成任務(wù)的并發(fā)處理。
【專利摘要】本發(fā)明公開(kāi)了一種基于任務(wù)分解的并行任務(wù)處理方法,該方法事件觸發(fā)對(duì)象不需要經(jīng)由多個(gè)隊(duì)列的順序傳遞,對(duì)象插入哪個(gè)對(duì)列是由對(duì)象自身的狀態(tài)參量決定的,線程不需要了解它所操作的對(duì)象從哪個(gè)任務(wù)隊(duì)列傳遞過(guò)來(lái),將要進(jìn)入哪個(gè)任務(wù)隊(duì)列,只需完成自身的任務(wù)處理。事件觸發(fā)對(duì)象、任務(wù)隊(duì)列和線程不相互影響,便于類的封裝。當(dāng)業(yè)務(wù)的多個(gè)子任務(wù)不具有順序相關(guān)性時(shí),可將其同時(shí)插入多個(gè)隊(duì)列,進(jìn)行子任務(wù)的并行化處理。為各類任務(wù)分配固定數(shù)量的處理線程組,無(wú)需為每個(gè)對(duì)象創(chuàng)建一個(gè)專用線程。
【IPC分類】G06F9-48
【公開(kāi)號(hào)】CN104793992
【申請(qǐng)?zhí)枴緾N201510188327
【發(fā)明人】王友釗, 黃靜
【申請(qǐng)人】浙江大學(xué)
【公開(kāi)日】2015年7月22日
【申請(qǐng)日】2015年4月21日