PHP-Swoole进程池Process\Pool的使用介绍

1.前言

进程池和线程池一样,通过预创建N个进程来调度处理工作任务,swoole提供的进程池的进程通信方式有消息队列和socket两种机制,下面我们来介绍下使用方式。

2.进程池进程通信消息队列的使用

<?php
$pool = new Swoole\Process\Pool(4, SWOOLE_IPC_MSGQUEUE, 0x70);

$pool->on("Message", function ($pool, $message) {
    echo "Message: {$message} Pid:" . posix_getpid() . PHP_EOL;
    sleep(1);
});

$pool->on("WorkerStart", function ($pool, $workerId) {
    echo "Worker#{$workerId} is started\n";
});

$pool->on("WorkerStop", function ($pool, $workerId) {
    echo "Worker#{$workerId} is stopped\n";
});

$pool->start();
<?php
$mq = msg_get_queue(0x70);

for ($i = 0; $i < 1000; $i++)
{
    msg_send($mq, 1, 'hello'.$i, false);
}

3.进程池进程通信socket的使用

socket的传输采用的是固定包头+包体的网络字节序传输

进程池每接收一次消息,就会主动断开客户端的连接(无论有没有write),所以不支持客户端连续发送多个包的情况,如果需要连续发送,只能断开重发。

<?php
$pool = new Swoole\Process\Pool(4, SWOOLE_IPC_SOCKET);

$pool->on("Message", function ($pool, $message) {
    echo "Message: {$message} Pid:" . posix_getpid() . PHP_EOL;
    $pool->write('finished: ' . $message);
});

$pool->listen('127.0.0.1', 7777);

$pool->start();
<?php
$client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);
$data = 'hello';

$client->on('connect', function(swoole_client $cli) use ($data) {
    swoole_timer_tick(9000, function() use ($cli, $data) {
        $cli->send(pack('N', strlen($data)). $data);
    });
});

$client->on('receive', function(swoole_client $cli, $data) {
   echo "Receive: $data" . PHP_EOL;
});

$client->on('error', function(swoole_client $cli) {
    echo 'error' . PHP_EOL;
});

$client->on('close', function(swoole_client $cli) {
    echo 'close' . PHP_EOL;
});

$client->connect('127.0.0.1', 7777);

如无特殊说明,文章均为本站原创,转载请注明出处。如发现有什么不对的地方,希望得到您的指点。

发表评论

电子邮件地址不会被公开。 必填项已用*标注