原文檔中:添加的定時任務(wù)在當(dāng)前進(jìn)程執(zhí)行(不會啟動新的進(jìn)程或者線程),如果任務(wù)很重(特別是涉及到網(wǎng)絡(luò)IO的任務(wù)),可能會導(dǎo)致該進(jìn)程阻塞,暫時無法處理其它業(yè)務(wù)
實際運行下來,發(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è)務(wù)
在定時器中增加sleep 15秒,還是同時返回了,看截圖(追加了一張)。我看了下響應(yīng)頭有長連接標(biāo)識,單進(jìn)程,共享一個連接, 應(yīng)該是阻塞呀
我覺得你沒理解定時器的含義。按照你的代碼,第1個請求到達(dá)服務(wù)端,服務(wù)端設(shè)置定時器1秒后執(zhí)行sleep。然后緊接著第2個請求過來了,這時候可能才過了10ms,遠(yuǎn)沒達(dá)到1秒,還沒到執(zhí)行sleep的時候,那么第2個請求也能被處理,同理其它請求也一樣
同時請求這個點 確實被我忽略了,重新整理了下邏輯,web端每隔一秒發(fā)出請求,還是不會阻塞,先返回客戶端,然后再執(zhí)行定時器中的邏輯。回到最初的問題,就是想模擬下 阻塞時如何發(fā)生的。目前看是同步非阻塞的。追加了一張新圖
檢查發(fā)現(xiàn)是開啟了eventLoop(后邊弄了下協(xié)程 忘了關(guān)了),按照你說的邏輯,沒問題。 當(dāng)前開啟定時器的請求非阻塞,下一次請求會被阻塞。thinks??