因?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)程。
本教程操作環(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教程