任務池管理與執行器

2022-07-30 11:12:08 字數 2998 閱讀 4272

1前言

乙個後台實時處理的業務平台,通常我們會根據資料的輸入與輸出,依據時間軸進行分解成不同階段或不同粒度的邏輯任務,而每乙個待處理的資料我們稱為任務或者訊息。任務之間的關係可以分為兩類:a 上下游父子關係,b 可以並行執行的兄弟關係。具有上下游關係的任務集合具有邏輯或資料依賴關係,即上游任務執行完後,才能執行下游任務;具有兄弟關係的任務間邏輯上互不影響,可以並行執行。

無論是上面任一情況的業務場景,我們都需要一種管理類,其職責:管理著一堆執行緒及其待執行的同型別任務集合。執行緒會等待去執行餵給它的任務,當任務集合大於執行緒集合的個數時,任務會在佇列排隊等待;而當執行緒集合個數大於任務集合時,執行緒會掛起處於阻塞等待狀態,執行器也相應地處於不飽和狀態。在jdk裡面有現成的管理類threadpoolexecutor,那麼在c++裡面看看類似的實現吧:

2任務與任務池

2.1任務

無論是訊息或業務資料,可以抽象地表達為:

struct

data_pair

2.2 任務池

任務的快取用佇列表達:

std::queue_queue; 

2.3 任務提交入口

int cqueuethread::writedata(void *data, int

len)

data_pair *item = new

data_pair();

item->data = (char*) malloc

(len);

assert(item->data !=null);

memcpy(item->data, data, len);

item->len =len;

_mutex.

lock

(); _queue.push(item);

_mutex.signal();

_mutex.unlock();

return

exit_success;

}

3執行緒池

3.1 執行緒封裝

c++裡面類似jdk裡面thread類的封裝cthread          

/**

* 起乙個執行緒,開始執行

*/bool start(runnable *r, void *a)

/*** 等待執行緒退出

*/void

join()

}/**

* 得到runnable物件

** @return runnable

*/runnable *getrunnable()

/*** 得到**引數

** @return args

*/void *getargs()

/***

* 得到執行緒的程序id

*/int

getpid()

/*** 執行緒的**函式

**/static

void *hook(void *arg)

return (void*) null;

}private

:

/*** 得到tid號

*/#ifdef _syscall0

static

_syscall0(pid_t,gettid)

#else

static pid_t gettid()

#endif

private

: pthread_t tid;

//pthread_self() id

int pid; //

執行緒的程序id

runnable *runnable;

void *args;

}; }

view code

3.2 執行緒池

並行處理的能力有執行緒池的個數決定,定義如下:

cthread *_thread;

int _threadcount;

4執行器

4.1 執行啟動

int

cdefaultrunnable::start()

_thread = new

cthread[_threadcount];

if (null ==_thread)

int i = 0

;

for (; i<_threadcount i>

}return

i;}

4.2 執行

執行器包含了具體業務的執行:

void cqueuethread::run(cthread *thread, void *args)

if(_stop)

data_pair *item =_queue.front();

_queue.pop();

_mutex.unlock();

if (item !=null)

if (item->data)

free

(item);

}_mutex.

lock

(); }

_mutex.unlock();

5 樣例**

cmyhandler handler;

cqueuethread queuethread(

3, &handler, null);

queuethread.start();

char data[1024

];for(int i=1; i<=mwritecount; i++)

queuethread.wait();

執行緒池 任務延時執行

我在做乙個匯入功能,匯入的邏輯都是呼叫的頁面介面。介面執行邏輯 將資料儲存到資料庫,然後再呼叫job任務加工歷史資料。使用者在頁面上操作是ok的,畢竟每操作一下,介面最多呼叫一次。但是匯入就不一樣了,相當於使用者一直在對著頁面點點點 這會導致後面歷史任務的加工出現問題。在匯入的時候,我需要先讓基本資...

執行緒池多工的執行順序

執行緒池場景 面試官 假設我們有乙個執行緒池,核心執行緒數為10,最大執行緒數也為20,任務隊列為100。現在來了100個任務,執行緒池裡現在有幾個執行緒執行?粉絲豪 應該是10吧。面試官 你確定?粉絲豪 確定啊,就是10 於是乎,粉絲豪就回去等通知了 其實這道題正確的答案是 不一定!因為並沒指明是...

任務管理器

dim url systemutil.run e 20111108 20111108 chinese hedexlite.exe process name inputbox 請輸入程序名 程序 hedexlite process list dialog windows 任務管理器 winlistvi...