有一個(gè)需求,需要設(shè)置一個(gè)定時(shí)任務(wù)來獲取用戶的交易數(shù)據(jù)(交易數(shù)據(jù)為第三方接口),由于用戶的數(shù)量不確定,所以要是一個(gè)一個(gè)來請(qǐng)求獲取并進(jìn)行處理(提取數(shù)據(jù)并寫入到數(shù)據(jù)庫),這樣顯得比較漫長。我在想,有沒有可以在一個(gè)進(jìn)程下,開啟多個(gè)線程(或者固定幾個(gè)線程),這幾個(gè)線程幫我來完成這堆用戶的交易數(shù)據(jù)處理?
(我有想到過使用parallel來處理,但對(duì)于每個(gè)用戶的交易數(shù)據(jù)有多有少,導(dǎo)致一次外部請(qǐng)求獲取不完,要多次請(qǐng)求這種情形,用這個(gè)處理不合適)
簡(jiǎn)單點(diǎn):
定時(shí)任務(wù)直接查出需要獲取用戶交易數(shù)據(jù)的用戶數(shù)量
然后按照這個(gè)數(shù)量拆分投遞到隊(duì)列中
比如10000個(gè)用戶,隊(duì)列開了十個(gè)進(jìn)程
那就每個(gè)隊(duì)列投遞1000的用戶
1.消息隊(duì)列,就像樓上說的
2.你想要固定的,無非就是開啟N個(gè)定時(shí)進(jìn)程。每個(gè)進(jìn)程查詢用戶范圍不一樣。比如有8個(gè)定時(shí)進(jìn)程,userTask1-userTask8,這些進(jìn)程要手動(dòng)設(shè)置好就行了
第二點(diǎn)可以,但有一個(gè)問題,每個(gè)進(jìn)程查詢用戶范圍不一樣,本來我打算根據(jù)進(jìn)程id來判斷(比如創(chuàng)建10個(gè)進(jìn)程
'task'=>[
'handler' => Task::class,
'eventLoop' => Workerman\Events\Swoole::class,
'count' => 10,
],
通過進(jìn)程id%10的余數(shù)來查詢指定用戶),但我在onWorkerStart輸出\Webman\App::worker()->id卻報(bào)錯(cuò),所以想不到還有什么辦法來做到每個(gè)進(jìn)程查詢用戶范圍不一樣
public function onWorkerStart($connection)
{
print_r($worker_id = $connection->id);
}
上消息隊(duì)列。那現(xiàn)在問題就變成消費(fèi)者數(shù)量的問題了。你可以單獨(dú)搞一個(gè)消費(fèi)者控制線程,動(dòng)態(tài)控制消費(fèi)者數(shù)量。