4.3.0 在 Process 中使用协程

最后更新于:2022-04-02 06:17:32

# 4.3.0 在 Process 中使用协程 [TOC] 在`4.3.0`版本之前,`Process`并不支持协程,需要在新进程的`callback_function`中使用`go`创建协程,并且进程自带的管道也不支持协程。在`4.3.0`版本中,`Process`也支持了协程,可以直接使用协程相关`API`,也可以使用协程调度的方式,实现进程间通信。 ## 使用协程 `4.3.0`版本`Process`类的构造方法增加了第四个参数,传入`true`表示开启协程。开启协程后,可以直接调用协程相关`API`,无需自行创建。 ~~~ $proc = new \swoole_process(function () { co::sleep(0.2); echo "SUCCESS\n"; }, false, 1, true); $proc->start(); ~~~ * 第四个参数传入`true`即可在`callback_function`中直接使用协程`API` ## 进程间通信 `4.3.0`版本新增了`Process::exportSocket`可以将管道导出为一个`Swoole\Coroutine\Socket`对象,通过读写此`Socket`就可以实现通信。 ~~~ $proc1 = new \swoole_process(function (swoole_process $proc) { $socket = $proc->exportSocket(); echo $socket->recv(); $socket->send("hello proc2\n"); echo "proc1 stop\n"; }, false, 1, true); assert($proc1->start()); $proc2 = new \swoole_process(function (swoole_process $proc) use ($proc1) { Co::sleep(0.01); $socket = $proc1->exportSocket(); $socket->send("hello proc1\n"); echo $socket->recv(); echo "proc2 stop\n"; }, false, 0, true); assert($proc2->start()); swoole_process::wait(true); swoole_process::wait(true); ~~~ ## 注意事项 * 主进程中不要使用协程,否则在协程空间内,可能无法`fork`子进程。主进程内还是继续使用同步阻塞或者异步的模式来管理进程 * 两个子进程之间实际上只需要一个管道即可完成通信 * 管道类型是`SOCK_STREAM`时,多个进程同时写入一个进程的管道,可能存在风险,可能会产生数据错乱。存在交叉写入时可以使用`SOCK_DGRAM`格式的管道,或者进行加锁
';