Heim  >  Artikel  >  PHP-Framework  >  Warum kann Swoole keinen Schlaf gebrauchen?

Warum kann Swoole keinen Schlaf gebrauchen?

WBOY
WBOYOriginal
2022-04-13 15:09:282711Durchsuche

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

Warum kann Swoole keinen Schlaf gebrauchen?

本教程操作环境: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教程

Das obige ist der detaillierte Inhalt vonWarum kann Swoole keinen Schlaf gebrauchen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn