swoole / rfc

Swoole 提案
116 stars 3 forks source link

"onWorker+事件"拆分为"onMainWorker+事件“和“onTaskWorker+事件” #66

Closed ffxhd closed 4 years ago

ffxhd commented 4 years ago

onWorkerStart 分为 onMainWorkerStart 和onTaskWorkerStart onWorkerStop、onWorkerExit、onWorkerError同此。

这样一来,就不必要写

$workerObj = new \must\WorkersCommon();
$server->on('workerStart', [ $workerObj, 'onWorkerStart']);//目前
$server->on('workerError', [ $workerObj, 'onWorkerError']);//目前

(意味着,不必要使用if-else小心翼翼地在mainWorker和taskWorker之间切换思维) 只需

$mainObj = new \must\MainWorkers();//不再需要继承上文的WorkersCommon
$server->on('Connect', [ $mainObj, 'onConnect' ]);
$server->on('Close', [ $mainObj, 'onClose' ]);
$server->on('Request', [ $mainObj, 'onRequest' ]);
$server->on('Finish',  [ $mainObj, 'onFinish']);
$server->on('Receive', [ $mainObj, 'onReceive' ]);
$server->on('MainWorkerStart', [ $workerObj, 'onMainWorkerStart']);//新增
$server->on('MainWorkerError', [ $workerObj, 'onMainWorkerError']);//新增

$taskObj = new \must\TaskWorkers();//不再需要继承上文的WorkersCommon
$server->on('Task', [ $taskObj,  'onTask']);
$server->on('TaskWorkerStart', [ $workerObj, 'onTaskWorkerStart']);//新增
$server->on('TaskWorkerError', [ $workerObj, 'onTaskWorkerError']);//新增

(切换类文件,思路也随之切换)

一个http请求进赖,如果mainWorker亲自处理业务,则同一个mainWorker中请求就得排队,逐个处理,简单的业务逻辑由于排队反而比较费时间。因此,mainWorker派了一个任务给taskWorker, 由taskWorker完成业务处理,处理完成后通知mainWorker响应数据给客户端。

因此,mainWorker和taskWorker,能力不同,职责也不同,对于启动、停止、出错的处理方式也就不同。(比如,mainWorker出错的话,不应自己亲自发邮件通知开发者,避免http请求进行不必要的等待;而应派发任务给taskWorker, 而taskWorker出错的话,则亲自发送邮件给开发者)onWorker开头的事件区分开为onMainWorker开头的事件和onTaskWorker开头的事件, 有利于避免思维混淆,更能够发挥各自的长处。

twose commented 4 years ago

应该在框架层实现, 和路由一个道理

matyhtf commented 4 years ago

通过 Server::isTaskWorker() 判断会更好。