首頁 >php框架 >Swoole >為什麼swoole不能用sleep

為什麼swoole不能用sleep

WBOY
WBOY原創
2022-04-13 15:09:282714瀏覽

因為在swoole中,使用sleep函數會使進程陷入睡眠阻塞;sleep過程中只有訊號可以打斷,由於swoole的訊號是基於signalfd實現的,所以即使發送訊號也無法中斷sleep,只有到指定的時間後作業系統才會重新喚醒目前的進程。

為什麼swoole不能用sleep

本教學操作環境:Windows10系統、Swoole4版、DELL G3電腦

為什麼swoole不能用sleep

#在非同步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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn