一種分配工作任務(wù)的方法及裝置的制造方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明實(shí)施例涉及信息系統(tǒng)的技術(shù)領(lǐng)域,尤其涉及一種分配工作任務(wù)的方法及裝置。
【背景技術(shù)】
[0002]信息系統(tǒng)中工作項(xiàng)是有優(yōu)先級順序的,要求排在前面的工作項(xiàng)先被處理,而且同一個工作項(xiàng)只能發(fā)給一個請求者。在多個人獲取工作項(xiàng)時,要求按請求者到達(dá)的先后順序按序發(fā)放工作項(xiàng),最先請求者取得排在最前面的工作項(xiàng),第二位請求者取得第2個工作項(xiàng),后面的請求者以此類推。
[0003]針對這種需求,通常的做法是將工作項(xiàng)按序放到內(nèi)存隊列中,這些隊列的實(shí)現(xiàn)方式有多種多樣,數(shù)組、列表、或鏈表等都可以;當(dāng)有請求者請求任務(wù)時,鎖住整個隊列,然后取出最靠前的一個工作項(xiàng),最后釋放對此隊列的鎖。在一個請求者對此隊列加鎖的過程中,其他請求者只能等待。這種內(nèi)存隊列加鎖的方案保證了任務(wù)是按序下發(fā)的,同時保證了同一個工作項(xiàng)不會分發(fā)給兩個以上的請求者,而且由于采用的是內(nèi)存隊列,相比直接從數(shù)據(jù)庫或硬盤文件中獲取任務(wù)來講,大大提高了性能。
[0004]但這種采用對共享內(nèi)存隊列加鎖的方式有明顯的弊端:第一,會導(dǎo)致資源開銷;第二,會阻塞其他線程的執(zhí)行,使得1個線程占有鎖的過程中其它線程只能等待,被阻塞的線程會被系統(tǒng)暫停任務(wù)的執(zhí)行或使其進(jìn)入睡眠狀態(tài)而不占用處理器,直到取得隊列鎖,該被阻塞的線程才能被喚醒,大量的時間浪費(fèi)在了睡眠等待、搶占鎖、喚醒上,其導(dǎo)致的結(jié)果是處理速度慢、支持的并發(fā)數(shù)少,不能滿足大量作業(yè)人員并發(fā)獲取工作項(xiàng)的需要。
【發(fā)明內(nèi)容】
[0005]本發(fā)明實(shí)施例的目的在于提出一種分配工作任務(wù)的方法及裝置,旨在解決如何實(shí)現(xiàn)高效的多線程并發(fā)獲取工作項(xiàng)任務(wù)的問題。
[0006]為達(dá)此目的,本發(fā)明實(shí)施例采用以下技術(shù)方案:
[0007]第一方面,一種分配工作任務(wù)的方法,所述方法包括:
[0008]裝載工作項(xiàng)任務(wù)隊列到二維數(shù)組中,二維數(shù)組的一維表示工作項(xiàng)類型,另一維表示具體的工作項(xiàng)任務(wù)隊列,并為每個工作項(xiàng)類型設(shè)置工作項(xiàng)序號取值范圍;
[0009]獲取用戶發(fā)送的處理工作任務(wù)的請求;
[0010]為所述請求創(chuàng)建任務(wù)分配線程;
[0011]通過所述任務(wù)分配線程執(zhí)行原子操作,為所述請求分配工作項(xiàng)序號;
[0012]若所分配的工作項(xiàng)序號超過所述工作項(xiàng)類型對應(yīng)的工作項(xiàng)序號取值范圍則返回沒有任務(wù),否則,根據(jù)所述工作項(xiàng)序號提取工作任務(wù),發(fā)送給所述用戶。
[0013]優(yōu)選地,通過所述任務(wù)分配線程執(zhí)行原子操作,為所述請求分配工作項(xiàng)序號包括:
[0014]通過所述任務(wù)分配線程,將工作項(xiàng)序號器的計數(shù)值按照設(shè)定規(guī)則進(jìn)行計算,計算確定的數(shù)值作為分配的工作項(xiàng)序號;
[0015]將工作項(xiàng)序號器的計數(shù)值加1或減1,得到的數(shù)值作為分配的工作項(xiàng)序號。
[0016]優(yōu)選地,所述通過所述任務(wù)分配線程,將工作項(xiàng)序號器的計數(shù)值按照設(shè)定規(guī)則進(jìn)行計算,計算確定的數(shù)值作為分配的工作項(xiàng)序號之前,還包括:
[0017]確定所述請求是否包括預(yù)先設(shè)置的工作項(xiàng)類型參數(shù);
[0018]若確定所述請求包括預(yù)先設(shè)置的工作項(xiàng)類型參數(shù),則通過原子操作為所述請求分配與所述工作項(xiàng)類型參數(shù)對應(yīng)的工作項(xiàng)類型序號;
[0019]若確定所述請求未包括預(yù)先設(shè)置的工作項(xiàng)類型參數(shù),則為所述請求分配工作項(xiàng)類型序號;
[0020]根據(jù)所述工作項(xiàng)類型參數(shù),確定對應(yīng)的工作項(xiàng)序號器。
[0021]優(yōu)選地,所述為所述請求分配工作項(xiàng)類型序號,包括:
[0022]執(zhí)行原子操作將工作項(xiàng)類型序號器的當(dāng)前計數(shù)值加1或減1,得到新計數(shù)值;
[0023]若新計數(shù)值超出工作項(xiàng)類型序號的取值范圍,則將工作項(xiàng)類型序號器計數(shù)值設(shè)為取值范圍的最小值或最大值,并將此修改后的數(shù)值作為新計數(shù)值;
[0024]將新數(shù)值作為分配給所述請求的工作項(xiàng)類型序號。
[0025]優(yōu)選地,所述根據(jù)所述工作項(xiàng)序號提取工作任務(wù),發(fā)送給所述用戶,包括:
[0026]根據(jù)所述工作項(xiàng)類型序號和工作項(xiàng)序號從預(yù)先存儲的二維數(shù)組中獲取工作任務(wù),所述二維數(shù)組的行序號對應(yīng)于工作項(xiàng)類型序號,列序號對應(yīng)于工作項(xiàng)序號。
[0027]優(yōu)選地,所述方法還包括:
[0028]所述所分配的工作項(xiàng)序號如果超過所屬工作項(xiàng)類型對應(yīng)的工作項(xiàng)序號取值范圍,則如果該工作項(xiàng)類型的任務(wù)裝載線程沒有啟動,則啟動該工作項(xiàng)類型的任務(wù)裝載線程,否貝1J,不需要進(jìn)行啟動任務(wù)裝載線程;
[0029]工作項(xiàng)類型的任務(wù)裝載線程首先設(shè)置該工作項(xiàng)類型的工作項(xiàng)序號取值范圍為空,清空所述二維數(shù)組中所述工作項(xiàng)類型序號對應(yīng)的所有工作任務(wù),并重新裝載該工作項(xiàng)類型的工作任務(wù)到二維數(shù)組中,并設(shè)置該工作項(xiàng)類型的工作項(xiàng)序號取值范圍與所裝載的工作項(xiàng)個數(shù)相匹配。
[0030]第二方面,一種獲取工作任務(wù)的裝置,所述裝置包括:
[0031]裝載模塊,用于裝載工作項(xiàng)任務(wù)隊列到二維數(shù)組中,二維數(shù)組的一維表示工作項(xiàng)類型,另一維表示具體的工作項(xiàng)任務(wù)隊列,并為每個工作項(xiàng)類型設(shè)置工作項(xiàng)序號取值范圍;
[0032]第一獲取模塊,用于獲取用戶發(fā)送的處理工作任務(wù)的請求;
[0033]創(chuàng)建模塊,用于為所述請求創(chuàng)建任務(wù)分配線程;
[0034]第一分配模塊,用于通過所述任務(wù)分配線程執(zhí)行原子操作,為所述請求分配工作項(xiàng)序號;
[0035]發(fā)送模塊,若所分配的工作項(xiàng)序號超過所述工作項(xiàng)類型對應(yīng)的工作項(xiàng)序號取值范圍則返回沒有任務(wù),否則,根據(jù)所述工作項(xiàng)序號提取工作任務(wù),發(fā)送給所述用戶。
[0036]優(yōu)選地,所述第一分配模塊,包括:
[0037]計算單元,用于通過所述任務(wù)分配線程,將工作項(xiàng)序號器的計數(shù)值按照設(shè)定規(guī)則進(jìn)行計算,計算確定的數(shù)值作為分配的工作項(xiàng)序號;
[0038]所述計算單元,用于:
[0039]通過所述任務(wù)分配線程,將工作項(xiàng)序號器的計數(shù)值加1或減1,確定的數(shù)值作為分配的工作項(xiàng)序號。
[0040]優(yōu)選地,所述裝置還包括:
[0041]第一確定模塊,用于在通過所述任務(wù)分配線程,將工作項(xiàng)序號器的計數(shù)值按照設(shè)定規(guī)則進(jìn)行計算,計算確定的數(shù)值作為分配的工作項(xiàng)序號之前,確定所述請求是否包括預(yù)先設(shè)置的工作項(xiàng)類型參數(shù);
[0042]第二分配模塊,用于若確定所述請求包括預(yù)先設(shè)置的工作項(xiàng)類型參數(shù),則通過原子操作為所述請求分配與所述工作項(xiàng)類型參數(shù)對應(yīng)的工作項(xiàng)類型序號;
[0043]第三分配模塊,用于若確定所述請求未包括預(yù)先設(shè)置的工作項(xiàng)類型參數(shù),則為所述請求分配工作項(xiàng)類型序號;
[0044]第二確定模塊,用于根據(jù)所述工作項(xiàng)類型參數(shù),確定對應(yīng)的工作項(xiàng)序號器。
[0045]優(yōu)選地,所述第三分配模塊,用于:
[0046]執(zhí)行原子操作將工作項(xiàng)類型序號器的當(dāng)前計數(shù)值加1或減1,得到新計數(shù)值;
[0047]若新計數(shù)值超出工作項(xiàng)類型序號的取值范圍,則將工作項(xiàng)類型序號器計數(shù)值設(shè)為取值范圍的最小值或最大值,并將此修改后的數(shù)值作為新計數(shù)值;
[0048]將新數(shù)值作為分配給所述請求的工作項(xiàng)類型序號。
[0049]優(yōu)選地,所述發(fā)送模塊,用于:
[0050]根據(jù)所述工作項(xiàng)類型序號和工作項(xiàng)序號從預(yù)先存儲的二維數(shù)組中獲取工作任務(wù),所述二維數(shù)組的行序號對應(yīng)于工作項(xiàng)類型序號,列序號對應(yīng)于工作項(xiàng)序號。
[0051 ] 優(yōu)選地,所述裝置還包括:
[0052]啟動模塊,用于所述所分配的工作項(xiàng)序號如果超過所屬工作項(xiàng)類型對應(yīng)的工作項(xiàng)序號取值范圍,則如果該工作項(xiàng)類型的任務(wù)裝載線程沒有啟動,則啟動該工作項(xiàng)類型的任務(wù)裝載線程,否則,不需要進(jìn)行啟動任務(wù)裝載線程;
[0053]處理模塊,用于工作項(xiàng)類型的任務(wù)裝載線程首先設(shè)置該工作項(xiàng)類型的工作項(xiàng)序號取值范圍為空,清空所述二維數(shù)組中所述工作項(xiàng)類型序號對應(yīng)的所有工作任務(wù),并重新裝載該工作項(xiàng)類型的工作任務(wù)到二維數(shù)組中,并設(shè)置該工作項(xiàng)類型的工作項(xiàng)序號取值范圍與所裝載的工作項(xiàng)個數(shù)相匹配。
[0054]本發(fā)明實(shí)施例通過裝載工作項(xiàng)任務(wù)隊列到二維數(shù)組中,二維數(shù)組的一維表示工作項(xiàng)類型,另一維表示具體的工作項(xiàng)任務(wù)隊列,并為每個工作項(xiàng)類型設(shè)置工作項(xiàng)序號取值范圍,獲取用戶發(fā)送的處理工作任務(wù)的請求;為所述請求創(chuàng)建任務(wù)分配線程,棄用加鎖、解鎖處理,減少排隊、耗時等的處理,支持多路并發(fā)的用戶發(fā)送的工作任務(wù)的請求;通過所述任務(wù)分配線程執(zhí)行原子操作,為所述請求分配工作項(xiàng)序號;若所分配的工作項(xiàng)序號超過所述工作項(xiàng)類型對應(yīng)的工作項(xiàng)序號取值范圍則返回沒有任務(wù),否則,根據(jù)所述工作項(xiàng)序號提取工作任務(wù),發(fā)送給所述用戶,從而實(shí)現(xiàn)多路并發(fā)請求工作任務(wù)的目的,極大的提高系統(tǒng)處理性能。
【附圖說明】
[0055]圖1是本發(fā)明實(shí)施例分配工作任務(wù)的方法第一實(shí)施例的流程示意圖;
[0056]圖2是本發(fā)明實(shí)施例分配工作任務(wù)的方法第二實(shí)施例的流程示意圖;
[0057]圖3是本發(fā)明實(shí)施例提供的另一分配工作任務(wù)的方法的示意圖;
[0058]圖4是本發(fā)明實(shí)施例分配工作任務(wù)的裝置的功能模塊示意圖;
[0059]圖5是本發(fā)明實(shí)施例第一分配模塊504的功能模塊不意圖;
[0060]圖6是本發(fā)明實(shí)