你好,我也遇到此问题,我查看了源代码,应该是有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进程对应 ]);
===========================
以上,请查证,谢谢。