因為在swoole中,使用sleep函數會使進程陷入睡眠阻塞;sleep過程中只有訊號可以打斷,由於swoole的訊號是基於signalfd實現的,所以即使發送訊號也無法中斷sleep,只有到指定的時間後作業系統才會重新喚醒目前的進程。
本教學操作環境:Windows10系統、Swoole4版、DELL G3電腦
#在非同步IO的程式中,不得使用sleep/usleep/time_sleep_until/time_nanosleep。 (下文中使用sleep泛指所有睡眠函數)
sleep函數會使進程陷入睡眠阻塞
直到指定的時間後作業系統才會重新喚醒目前的進程
sleep過程中,只有訊號可以打斷
由於Swoole的訊號處理是基於signalfd實現的,所以即使發送訊號也無法中斷sleep
Swoole提供的swoole_event_add、swoole_timer_tick、swoole_timer_after、swoole_process::signal、非同步swoole_client 在進程sleep後會停止運作。 swoole_server也無法再處理新的請求。
實例程式
$serv = new swoole_server("127.0.0.1", 9501); $serv->set(['worker_num' => 1]); $serv->on('receive', function ($serv, $fd, $from_id, $data) { sleep(100); $serv->send($fd, 'Swoole: '.$data); }); $serv->start();
onReceive事件中執行了sleep函數,server在100秒內無法再收到任何客戶端請求。
推薦學習:swoole教學
以上是為什麼swoole不能用sleep的詳細內容。更多資訊請關注PHP中文網其他相關文章!