Closed suuhui closed 1 year ago
<?php
use Swoole\Process;
use Swoole\Event;
class DeadLock
{
public function startProcess()
{
$t = new Swoole\Process(function () {
swoole_async_set(['enable_coroutine' => true]);
go(function (){
for (; ;) {
Swoole\Coroutine\System::sleep(1);
var_dump('dd');
}
});
Swoole\Event::wait();
});
$t->start();
Process::wait();
}
}
$proc = new Process(function () {
swoole_async_set(['enable_coroutine' => false]);
$cls = new DeadLock();
//$cls->startProcess();
\Swoole\Timer::after(1000, function () use ($cls) {
$cls->startProcess();
});
Event::wait();
});
var_dump($proc->start());
Process::wait();
你可以试试这么写,现在是推荐在文件末尾加上Swoole\Event::wait()
启动事件机制。
@NathanFreeman 这样写就可以了,能讲解下为什么不加Swoole\Event::wait()
就报错吗
这个其实是因为如果不加Swoole\Event::wait()
,依靠php_swoole_register_shutdown_function
注册的函数执行事件机制的话在一些特定的场景下总有一些奇奇怪怪的问题。
现象
swoole进程中,创建协程,使用协程客户端从服务端收取消息,结果报错
[FATAL ERROR]: all coroutines (count: 1) are asleep - deadlock!
简化代码
环境信息
php版本:7.2.34 swoole版本: