× 警告!旧版文档已经暂停维护,请查看新版文档。点击前往新版文档

sleep/usleep的影响

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

  • sleep函数会使进程陷入睡眠阻塞
  • 直到指定的时间后操作系统才会重新唤醒当前的进程
  • sleep过程中,只有信号可以打断
  • 由于Swoole的信号处理是基于signalfd实现的,所以即使发送信号也无法中断sleep

Swoole提供的swoole_event_addswoole_timer_tickswoole_timer_afterswoole_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秒内无法再收到任何客户端请求。


  • Jason

    为什么在task进程中也不能能使用sleep

  • 茶花烙

    jason 你有尝试么?

  • 卷小毛

    可以在 task中使用的

  • Ryan

    测试中,使用 该方法依旧会堵塞,不知是否是我的代码问题,以下是我的测试代码

    go(function (){ for ($i = 0; $i

  • Ryan

    go(function (){ for ($i = 0; $i