有這樣的場景,**開放平台上有銷售訂單api,銷售訂單金額api,商品上下架api,退款api等各種開放的 api,稍微有點規模的商家都會自己開發基於**平台的資訊管理系統,裡面會涉及到訂單管理,採購管理,庫存管理,售後管理等,這些管理系統裡面的資料都是通過api獲取,或者通過api推送到**平台上,這些系統的好處就是避免工作人員直接在**後台進行各項操作。
基於上面的情況,那麼自然會有很多後台程式來跑這些 api,剛開始我是這樣設計的。
在乙個後台程式裡面開幾個執行緒,每個執行緒對應幾個api,這樣也能夠滿足日常需求,但是隨著業務量增大,會有各種資料或者任務需要處理,這個時候上面的程式也能滿足需求,但是每次都要修改程式,然後在發布,實在是有些頭疼。後來我就想,能不能開發乙個管理平台,來自動管理這些任務,什麼時候想停止任務,直接在配置管理**上點一下按鈕,想開啟也是一樣操作,如果推出這樣的乙個管理平台,那麼像管理這種業務資料的活可以直接丟給店鋪管理人員。
經過一番思考,想到了這樣一種方案,先看圖。
上面的圖可以很清晰看出工作管理模型。其實到這個時候,最最關心還是工作管理器的核心到底是怎樣設計的?那我就說說我的思路是怎樣的。
首先是工作任務執行時間的設計,因為有的api是需要白天執行的有的是晚上閒時執行的,有的是7*24小時不間斷執行的,那麼我們可以設計這樣的乙個列舉,命名worktype,具體內容是:
publicallwork 的執行時間是全天,worktime的執行時間是早上9點到晚上22點,morning的執行時間是凌晨3點到早上9點,night的執行時間是晚上22點到凌晨3點,相信這幾個時間區域很多開發同事都會涉及到的。enum
worktype
然後是工作執行緒類workthread,將它定義為乙個抽象類,裡面含有乙個抽象方法workrun,每乙個詳細的任務類都會繼承workthread類,實現抽象方法,也就是說,每個任務的業務處理邏輯都是在workrun方法裡面實現的。因為上面提到了任務的執行時間區間,那麼我們在初始化乙個繼承workthread類的時候,會設定它的執行時間區間。然後在這個抽象類中還還有乙個方法,它的作用就是將實現了workthread的類丟到threadpool裡面,看看具體的實現**。
public那麼具體的任務類如下。abstract
class
workthread
public
int step
public worktype worktype
public
bool
haswork
return
result;}}
public
abstract
void workrun(object
ob);
public
void
run()
public
void
addstep()
}
public其實到這裡了,有的人會想到,那我們怎麼來管理這些workthread類了,這裡我們專門有乙個類來管理workthread,這裡命名為workmanager。這個類裡面的結構就相當簡單了。看到上面的模型圖,可以猜出一些端倪。裡面專門定義了乙個字典項,用來儲存每乙個workthread,它是concurrentdictionary,表示可由多個執行緒同時訪問的鍵值對的執行緒安全集合。管理類裡面還定義了4個方法,增加刪除workthread,開始結束workthread。具體看下面的**。class
testa : workthread
public
override
void workrun(object
ob)
}
public**是不是很簡單,到這裡位置,工作管理的核心**全部上完了,那我們該怎麼呼叫了,看看下面呼叫**。class
workmanager
}public
void
addwork(workthread workthread)
public
void removework(string
workthreadid)
public
void
startwork()
else
}thread.sleep(
5000
); }
};action.begininvoke(cb => action.endinvoke(cb), null
); }
public
void
endwork()
;action.begininvoke(cb => action.endinvoke(cb), null
); }
}
console.title = "看一下執行效果圖:工作管理器";
workmanager manager = new
workmanager();
manager.addwork(
new testa(1
, worktype.allwork));
manager.addwork(
new testb(1
, worktype.allwork));
manager.startwork();
console.writeline(
"1.全部開始工作");
thread.sleep(
15 * 1000
); manager.endwork();
console.writeline(
"2.全部解除安裝");
thread.sleep(
10 * 1000
); manager.addwork(
new testb(1
, worktype.allwork));
console.writeline(
"3.加入b");
console.read();
乙個簡單的ThreadPool分析
專案是多執行緒的,所以引入了執行緒池這個東西。池子是個老美寫的。在專案中表現的還不錯。所以把它摘出來,介紹給以後或許需要用到它的同行們。關於為什麼要採用threadpool,原文已經提到了 建立乙個執行緒是需要開銷的 如果執行緒數量過大的話,cpu就會浪費很大的精力做執行緒切換。threadpool...
嘗試實現乙個簡單的threadpool
參考資料 c 高併發多執行緒學習 一 c 併發程式設計 part 2 標頭檔案 include include include include include include include include include using namespace std class task task vi...
對threadpool的效能測試
自己編寫的threadpool http www.oschina.net code snippet 102078 2072或者http jaff20071234.download.csdn.net 沒有正規的文件,只能自己編寫程式進行效能測試了。1。建立乙個threadmanage物件只含有10個執...