封裝多執行緒處理大量資料操作(一)

2022-02-01 04:15:59 字數 2039 閱讀 1977

起因:

封裝多執行緒處理大量資料操作(二)

最近在寫乙個導資料的程式,需要從幾個老資料表中取出n多的資料,然後加以處理再新增到新資料庫的對應表中。單步操作太慢了,這不正是多執行緒的用武之地嗎?

對於每一種資料我都得寫一套類似的**,表意**如下

//從老資料庫中獲得一批老資料

dataset dsuser = olddbaccess.getoldusers(minid);

//將dataset中的資料分成n份,放到sectionusers的datatable中

datatable sectionusers = new datatable[threadcn];

autoresetevent evts = new autoresetevent[threadcn];

//初始化evts的值

//將資料和autoresetevent放到乙個資料中交給threadpool去處理,具體的處理方法略去了

由於老資料有n種,每一種的處理方法又不一樣,所以我寫了n個類似上面的處理步驟,這太累了吧,於是想重構,將上面的操作步驟中相同的地方提取出來。於是有了asynchelper靜態類,這個靜態類有幾個公開的靜態方法來做上面那些分多個執行緒處理大量資料的步驟中一樣的過程。

第乙個方法的簽名應該是這樣子的

/// /// 執行多執行緒操作任務

///

/// 多執行緒操作的資料集合

/// 分多少個執行緒來做

/// 處理資料集合中單個資料使用的處理方法

public static void doasync(ilist datacollection, int threadcn, waitcallback processitemmethod)

大量的資料定義乙個ilist型別的類作為引數傳遞,要分多少個執行緒來處理這些資料用threadcn指定,需要注意的是waithandle.waitall方法決定了threadcn必須小於64,最後乙個引數是處理大量資料中的乙個資料的方法。方法的簽名出來了,我在上面又做了幾次重複的處理,寫這個方法應該不是個問題。同樣的我們也是需要把ilist資料分成threadcn份,然後將每乙份都交給threadpool來處理,這很簡單。

/// /// 執行多執行緒操作任務

///

/// 多執行緒操作的資料集合

/// 分多少個執行緒來做

/// 處理資料集合中單個資料使用的處理方法

public static void doasync(ilist datacollection, int threadcn, waitcallback processitemmethod)

if (threadcn > datacollection.count) threadcn = datacollection.count;

ilist colls = new arraylist[threadcn];

autoresetevent evts = new autoresetevent[threadcn];

for (int i = 0; i < threadcn; i++)

for (int i = 0; i < datacollection.count; i++)

for (int i = 0; i < threadcn; i++));}

waithandle.waitall(evts);

}private static void doprivate(object data)

evt.set();

}

這個很容易實現,不過既然要做封裝我們就不得不多考慮一些,我們的執行緒好比是乙個乙個的偵查兵,這次給他們的任務是抓乙個敵人回來問問敵情,任務要求只抓乙個敵人,也就是說如果某乙個偵查兵抓到乙個敵人之後要給其他戰友發資訊,告訴他們別忙了,任務已經完成了。這個該怎麼辦呢,辦法總是要比問題多的。

waithandle類有waitany靜態方法,上面偵察兵的例子不就是個waitany嗎,主線程需要在接受到乙個執行緒完成的訊號後通知所有執行緒,「任務完成了,大家都回家吧」?大家如果有興趣的話,可以給出自己的方案,我的方案明天放出來。明天一併要解決的還有取得多個執行操作的返回值問題。

多執行緒處理mysql資料

閒來無事研究了下py,發現多執行緒處理起資料來比php不要爽太多,廢話少說上碼 author yao import mydb from time import ctime,sleep def mythread db for i in xrange 10 sql select from y user ...

python多執行緒處理資料

python多執行緒處理資料 從檔案讀取資料,多執行緒處理 usr bin env python encoding utf 8 import threading import time from queue import queue def readfile file object open opt...

C 多執行緒處理資料

os centos 7 編譯環境 gcc 4.8 cpu 2顆 intel r xeon r cpu e5 2670 v3 2.30ghz,24核48執行緒。int pthread create pthread t thread,const pthread attr t restrict attr,...