swoole / rfc

Swoole 提案
116 stars 3 forks source link

RFC-1015 : Server->task 允许使用在非 Worker 进程中使用 #38

Closed matyhtf closed 5 years ago

matyhtf commented 5 years ago

现状

目前在MasterManagerUser Process中无法调用Server->task投递任务。 主要原因是非Worker进程不方便实现Server->finishonFinish回调。

改进

增加单向task支持,类型为SW_TASK_NOREPLY,使MasterManagerUser Process中均可使用Server->task投递任务。

但这个过程只能是单向的onTask回调中不得使用Server->finishreturn数值,回复任务结果。否则底层会抛出错误信息。

taskwaittaskCotaskWaitMulti 依然只允许在Worker进程中使用

TaskWorker

Task Worker进程中仍然禁止使用Server->task,主要原因是,避免出现永动机,无限递归产生新的任务,导致死锁。

Task Worker进程本身定位是消费者进程,其他是生产者,在Task Worker中允许投递任务,完全破坏了生产者消费者模型,消费者又是生产者,这产生了混乱。

版本

shiguangqi commented 5 years ago

我觉得只允许在User Process中使用Server->task投递任务即可。

  1. MasterManager非工作进程,不该处理任务

  2. Task Worker 已经是被投递任务的执行体,再投递单向的task任务容易导致task滥用,task严重阻塞。这个功能可以用Task Woker中开启协程来代替。

matyhtf commented 5 years ago

现在 master manager 进程已经移除了各种限制。过去我们底层设置的约束条件太多了,我们逐渐去掉这个限制,由开发者自己去选择。

iiQi commented 5 years ago

UserWorker投递任务,是不是可以设置在worker进程中onFinish?

UserWorker投递 -> Task 执行 -> Worker onFinish

matyhtf commented 5 years ago

@mineyang 这个逻辑是有问题的。finish 的意思是结果原路返回。

iiQi commented 5 years ago

我现在是做了一个代理,从UserWorker进程里使用sendMessage方法发送worker进程(随机指定),再从worker进程里转发任务,任务完成后返回给worker进程处理

matyhtf commented 5 years ago

你这里直接用 sendMessage 就可以实现,不需要中转。