Swoole从入门到入土(22)——多进程[Process]

Swoole的Process模块提供了一种更易用的方式来实现PHP的多进程编程,支持进程间通讯、标准输入输出重定向,以及在子进程中执行其他程序。在协程环境中,虽然不能直接使用Process模块,但可以通过runtimehook+proc_open实现类似功能。文章通过示例展示了如何创建和管理子进程,并介绍了Process的各种属性和方法,如start、exit、kill、wait等,以及如何处理进程间通信和信号监听。

        Swoole中的Process模块比原生php提供的pcntl模块,提供了更易用的多进程编程接口。 简单总结,Process模块有如下特点:

· 可以方便的实现进程间通讯
· 支持重定向标准输入和输出,在子进程内 echo 不会打印屏幕,而是写入管道,读键盘输入可以重定向为管道读取数据
· 提供了 exec 接口,创建的进程可以执行其他程序,与原 PHP 父进程之间可以方便的通信
· 在协程环境中无法使用 Process 模块,可以使用 runtime hook+proc_open 实现,参考协程进程管理

让我们先看一下例子:创建 3 个子进程,主进程用 wait 回收进程,主进程异常退出时,子进程会继续执行,完成所有任务后退出

use Swoole\Process;

for ($n = 1; $n <= 3; $n++) {
    $process = new Process(function () use ($n) {
        echo 'Child #' . getmypid() . " start and sleep {$n}s" . PHP_EOL;
        sleep($n);
        echo 'Child #' . getmypid() . ' exit' . PHP_EOL;
    });
    $process->start();
}
for ($n = 3; $n--;) {
    $status = Process::wait(true);
    echo "Recycled #{$status['pid']}, code={$status['code']}, signal={$status['signal']}" . PHP_EOL;
}
echo 'Parent #' . getmypid() . ' exit' . PHP_EOL;

关于上面使用的Process成员属性或函数看不懂?不用着急,现在我们就一一进行讨论。

属性

1) pid:子进程的pid

Swoole\Process->pid: int

2) pipe:unixSocket 的文件描述符。

Swoole\Process->pipe;

方法

1) __contruct():构造方法

Swoole\Process::__construct(callable $function, bool $redirect_stdin_stdout = false, int $pipe_type = SOCK_DGRAM, bool $enable_coroutine = false);

$function:子进程创建成功后要执行的函数【底层会自动将函数保存到对象的 callback 属性上。如果希望更改执行的函数,可赋值新的函数到对象的 callback 属性】

$redirect_stdin_stdout:重定向子进程的标准输入和输出。【启用此选项后,在子进程内输出内容将不是打印屏幕,而是写入到主进程管道。读取键盘输入将变为从管道中读取数据。默认为阻塞读取。】 

$pipe_type:unixSocket 类型【启用 $redirect_stdin_stdout 后,此选项将忽略用户参数,强制为 1。如果子进程内没有进程间通信,可以设置为 0】,可选值如下:

$enable_coroutine:在 callback function 中启用协程,开启后可以直接在子进程的函数中使用协程 API。

2) set():设置参数

Swoole\Process->set(array $settings)

可以使用 enable_coroutine 来控制是否启用

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值