原文檔中:添加的定時任務在當前進程執(zhí)行(不會啟動新的進程或者線程),如果任務很重(特別是涉及到網(wǎng)絡IO的任務),可能會導致該進程阻塞,暫時無法處理其它業(yè)務
實際運行下來,發(fā)現(xiàn)是非阻塞的。
$worker->count = 1;
$worker->onMessage = function (\Workerman\Connection\TcpConnection $connection, \Workerman\Protocols\Http\Request $request) {
\Workerman\Timer::add(10, function()use($connection){
echo "aaaa".date("Y-m-d H:i:s").PHP_EOL;
}, null, false);
\Workerman\Timer::add(5, function()use($connection){
echo "bbb".date("Y-m-d H:i:s").PHP_EOL;
}, null, false);
// 向瀏覽器發(fā)送hello world
$connection->send('hello world'.date("Y-m-d H:i:s"));
};
\Workerman\Worker::runAll();
瀏覽器同時發(fā)起了9個請求
頁碼同時返回收到hell word
然后再執(zhí)行完兩個定時器
\Workerman\Timer::add(1, function()use($connection){
sleep(15);
echo "aaaa ".date("Y-m-d H:i:s").PHP_EOL;
}, null, false);
\Workerman\Timer::add(1, function()use($connection){
sleep(5);
echo "bbb ".date("Y-m-d H:i:s").PHP_EOL;
}, null, false);
客戶端并發(fā)請求
客戶端每隔1秒請求
echo "aaaa".date("Y-m-d H:i:s").PHP_EOL;
不是很重的業(yè)務
我覺得你沒理解定時器的含義。按照你的代碼,第1個請求到達服務端,服務端設置定時器1秒后執(zhí)行sleep。然后緊接著第2個請求過來了,這時候可能才過了10ms,遠沒達到1秒,還沒到執(zhí)行sleep的時候,那么第2個請求也能被處理,同理其它請求也一樣
同時請求這個點 確實被我忽略了,重新整理了下邏輯,web端每隔一秒發(fā)出請求,還是不會阻塞,先返回客戶端,然后再執(zhí)行定時器中的邏輯?;氐阶畛醯膯栴},就是想模擬下 阻塞時如何發(fā)生的。目前看是同步非阻塞的。追加了一張新圖
檢查發(fā)現(xiàn)是開啟了eventLoop(后邊弄了下協(xié)程 忘了關了),按照你說的邏輯,沒問題。 當前開啟定時器的請求非阻塞,下一次請求會被阻塞。thinks??