手册里的主进程和子进程疑问

renji566

问题描述

下面手册的主进程和子进程与上图对应吗 ? 主进程不是不处理逻辑吗?这里不是很懂

三、区分主进程和子进程
有必要注意下代码是运行在主进程还是子进程,一般来说在Worker::runAll();调用前运行的代码都是在主进程运行的,onXXX回调运行的代码都属于子进程。注意写在Worker::runAll();后面的代码永远不会被执行。

例如下面的代码

use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';

// 运行在主进程
$tcp_worker = new Worker("tcp://0.0.0.0:2347");
// 赋值过程运行在主进程
$tcp_worker->onMessage = function(TcpConnection $connection, $data)
{
// 这部分运行在子进程
$connection->send('hello ' . $data);
};

Worker::runAll();
注意: 不要在主进程中初始化数据库、memcache、redis等连接资源,因为主进程初始化的连接可能会被子进程自动继承(尤其是使用单例的时候),所有进程都持有同一个连接,服务端通过这个连接返回的数据在多个进程上都可读,会导致数据错乱。同样的,如果任何一个进程关闭连接(例如daemon模式运行时主进程会退出导致连接关闭),都导致所有子进程的连接都被一起关闭,并发生不可预知的错误,例如mysql gone away 错误。

推荐在onWorkerStart里面初始化连接资源

265 2 0
2个回答

liziyu

我理解:workerman只是同时管理了多个独立的fpm模型进程,并使它有序的常驻内在并相互隔离。

  • renji566 13天前

    这里代码说的主进程和master有关系吗

JaguarJack

master 进程不处理任务业务逻辑,主要负责监控 worker。图没问题啊

  • renji566 13天前

    那事例中的代码运行在主进程指的是哪个主进程

  • JaguarJack 12天前

    master 主进程。就是你运行代码那个进程。代码里面会 fork worker 进程出来处理业务逻辑的

×
🔝