325 Star 1.6K Fork 345

GVPswoole / swoole-src

 / 详情

server->task(): worker_id must be less than task_worker_num

待办的
创建于  
2020-10-02 21:15

问题: worker_id must be less than task_worker_num

你好,我也遇到此问题,我查看了源代码,应该是有bug

==================== swoole_server.cc ===========================

static sw_inline int php_swoole_check_task_param(Server *serv, zend_long dst_worker_id) {
if (UNEXPECTED(serv->task_worker_num == 0)) {
php_swoole_fatal_error(E_WARNING, "task method can't be executed without task worker");
return SW_ERR;
}
if (UNEXPECTED(dst_worker_id >= serv->task_worker_num)) {
php_swoole_fatal_error(E_WARNING, "worker_id must be less than task_worker_num[%u]", serv->task_worker_num);
return SW_ERR;
}
if (UNEXPECTED(serv->is_task_worker())) {
php_swoole_fatal_error(E_WARNING, "Server->task() cannot use in the task-worker");
return SW_ERR;
}
return SW_OK;
}

==========================================================

Swoole\Server->task(mixed $data, int $dstWorkerId = -1, callable $finishCallback): int
参数: int $dstWorkerId
功能:可以指定要给投递给哪个 Task 进程,传入 ID 即可,范围参考 $worker_id

==============================================================

`
$worker_id
得到当前 Worker 进程的编号,包括 Task 进程。

提示
这个属性与 onWorkerStart 时的 $workerId 是相同的。
Worker 进程编号范围是 [0, $serv->setting['worker_num']-1]
Task 进程编号范围是 [$serv->setting['worker_num'], $serv->setting['worker_num'] + $serv->setting['task_worker_num']]

======================================================================

以上,手册是正确的,但swoole_server.cc里,中间明显有BUG。

=============================================

我目前绕过这个bug的方法是:

$server->set([ 'task_worker_num' => count($this->productIds) + 10, // 保证每个产品有一个task进程对应 ]);

===========================

以上,请查证,谢谢。

评论 (0)

zymeli 创建了任务
zymeli 关联仓库设置为swoole/swoole-src
展开全部操作日志

登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(1)
C
1
https://gitee.com/swoole/swoole.git
git@gitee.com:swoole/swoole.git
swoole
swoole
swoole-src

搜索帮助