首页
下载
文档
社区
视频
捐赠
源代码
赞助商
AOT 编译器
AI 助理
商业产品
PHP AOT 原生编译器
Swoole-Compiler 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
timer_callback 没线程问题
### 问题描述 错误信息: WARNING Server::timer_callback() (ERRNO 9007): No idle task worker is available 我在一个定时里面每隔一分钟每次循环处理的数据是1--5W条数据来更新数据状态,会一直提示没有空闲的工作线程可用 ### Swoole版本,PHP版本,以及操作系统版本信息 swoole-cli-v5.0.1 php 8.1 ### 相关代码 ```php 请将代码粘贴至此处(请勿用截图) ``` ### 你期待的结果是什么?实际看到的错误信息又是什么? 如何避免这个问题, 我需要重新定义一个新的定时器吗? 还是需要怎么去操作这个线程才能得到释放
发布于3年前 · 14 次浏览 · 来自
提问
飞天小猪!
### 问题描述 错误信息: WARNING Server::timer_callback() (ERRNO 9007): No idle task worker is available 我在一个定时里面每隔一分钟每次循环处理的数据是1--5W条数据来更新数据状态,会一直提示没有空闲的工作线程可用 ### Swoole版本,PHP版本,以及操作系统版本信息 swoole-cli-v5.0.1 php 8.1 ### 相关代码 ```php 请将代码粘贴至此处(请勿用截图) ``` ### 你期待的结果是什么?实际看到的错误信息又是什么? 如何避免这个问题, 我需要重新定义一个新的定时器吗? 还是需要怎么去操作这个线程才能得到释放
赞
0
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
登录
后参与评论
评论
2022-12-24
Rango
这只是一个提醒,表示没有可用的 task 进程。你可以忽略它,或者调整 `task_worker_num` 配置。
赞
0
回复
2022-12-28
飞天小猪!
回复
Rango
是的,已经解决了。我还有一个问题,方便回答下吗?
赞
0
回复
2022-12-28
飞天小猪!
回复
Rango
这个多线程代码,我有点想不通是如果我的数据是10W条,我要怎么分批他们? $process->write('index:'.$i); 这个写不了数组
赞
0
回复
2022-12-28
飞天小猪!
回复
飞天小猪!
我这样子写好像不行 ```php //比如说我这里是10W条数据需要现在处理 $data = [ [ 'id'=>1, 'status'=>1 ], [ 'id'=>2, 'status'=>1 ], [ 'id'=>3, 'status'=>1 ] ]; //这里直接循环吗? 使用count 这样子好像就执行了几条,其他都无法执行了 for($i = 0; $i < count($data) ; $i++){ $process = new swoole_process('callback_function', $redirect_stdout); // 启用消息队列 int $msgkey = 0, int $mode = 2 $process- useQueue(0, 2); $pid = $process- start(); // 管道写入内容 $process- write('index:'.$i); $process- push('进程的消息队列内容'); // 将每一个进程的句柄存起来 $workers[$pid] = $process; } ```
赞
0
回复
2022-12-28
飞天小猪!
```php <?php /** * 创建多进程 */ $worker_num = 6; // 默认进程数 $workers = []; // 进程保存 $redirect_stdout = false; // 重定向输出 ; 这个参数用途等会我们看效果 for($i = 0; $i < $worker_num; $i++){ $process = new swoole_process('callback_function', $redirect_stdout); // 启用消息队列 int $msgkey = 0, int $mode = 2 $process- useQueue(0, 2); $pid = $process- start(); // 管道写入内容 $process- write('index:'.$i); $process- push('进程的消息队列内容'); // 将每一个进程的句柄存起来 $workers[$pid] = $process; } /** * 子进程回调 * @param swoole_process $worker [description] * [[@return ](/u/49128)](/u/49128)[type] [description] */ function callback_function(swoole_process $worker) { $recv = $worker- pop(); echo "子输出主内容: {$recv}".PHP_EOL; //get guandao content $recv = $worker- read(); $result = doTask(); echo PHP_EOL.$result.'==='.$worker- pid.'==='.$recv; $worker- exit(0); } /** * 监控/回收子进程 */ while(1){ $ret = swoole_process::wait(); if ($ret){// $ret 是个数组 code是进程退出状态码, $pid = $ret['pid']; echo PHP_EOL."Worker Exit, PID=" . $pid . PHP_EOL; }else{ break; } } /** * doTask * [[@return ](/u/49128)](/u/49128)[type] [description] */ function doTask() { sleep(2); return true; } ```
赞
0
回复
2023-01-03
Rango
无法直接发送数组和对象,需要 json_encode 或者 serialize
赞
0
回复