為什么swoole不能用sleep

因?yàn)樵?a href="http://m.babyishan.com/tag/swoole">swoole中,使用sleep函數(shù)會(huì)使進(jìn)程陷入睡眠阻塞;sleep過程中只有信號(hào)可以打斷,由于swoole的信號(hào)是基于signalfd實(shí)現(xiàn)的,所以即使發(fā)送信號(hào)也無法中斷sleep,只有到指定的時(shí)間后操作系統(tǒng)才會(huì)重新喚醒當(dāng)前的進(jìn)程。

為什么swoole不能用sleep

本教程操作環(huán)境:Windows10系統(tǒng)、Swoole4版、DELL G3電腦

為什么swoole不能用sleep

異步IO的程序中,不得使用sleep/usleep/time_sleep_until/time_nanosleep。(下文中使用sleep泛指所有睡眠函數(shù))

  • sleep函數(shù)會(huì)使進(jìn)程陷入睡眠阻塞

  • 直到指定的時(shí)間后操作系統(tǒng)才會(huì)重新喚醒當(dāng)前的進(jìn)程

  • sleep過程中,只有信號(hào)可以打斷

  • 由于Swoole的信號(hào)處理是基于signalfd實(shí)現(xiàn)的,所以即使發(fā)送信號(hào)也無法中斷sleep

Swoole提供的swoole_event_add、swoole_timer_tick、swoole_timer_after、swoole_process::signal、異步swoole_client 在進(jìn)程sleep后會(huì)停止工作。swoole_server也無法再處理新的請(qǐng)求。

實(shí)例程序

$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事件中執(zhí)行了sleep函數(shù),server在100秒內(nèi)無法再收到任何客戶端請(qǐng)求。

推薦學(xué)習(xí): swoole教程

以上就是為什么

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊11 分享