Home
Download
Document
Forum
Video
Donate
Source Code
AI 助理
Sponsors
CRMEB
Apipost
腾讯云
微擎
禅道
51Talk
Products
Swoole AI 智能文档翻译器
Swoole-Compiler PHP 代码加密器
CRMEB 新零售社交电商系统
Login
Register
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
异步服务器协程task大量并发造成mysql连接池不够用
### 问题描述 各位彦祖好, 异步服务器向task投递大量mysql任务时(10万+),task协程并发处理速度太快,造成数据库连接池不够用,有办法限制下速度或其它方式来处理? 已尝试: 1. 提取mysql连接池前强行while sleep等待池空闲。 (大量协程空转) 2.收到task向协程Channel push,pop消费+co::sleep减速. (因协程下的co::sleep,所以使用$serv->getWorkerStatus判断taskWorker状态后投递并不严谨) 3.关闭task_enable_coroutine使用同步task方式 (task下很多协程功能无法使用) ### Swoole版本,PHP版本,以及操作系统版本信息 Swoole版本: 4.7.1 PHP版本: PHP 7.2.34 (cli) (built: Oct 1 2020 13:37:37) ( NTS ) 操作系统版本: CentOS Linux release 7.9.2009 (Core) ### 相关代码 ``` server配置: worker_num = 16 task_worker_num =16 enable_coroutine = true task_enable_coroutine = true 协程配置: Co::set(['hook_flags'=> SWOOLE_HOOK_CURL | SWOOLE_HOOK_TCP]); ``` ### 你期待的结果是什么?实际看到的错误信息又是什么? 请问是否有办法限制task处理速度或同步队列来处理mysql任务。
发布于3年前 · 22 次浏览 · 来自
提问
jason58
### 问题描述 各位彦祖好, 异步服务器向task投递大量mysql任务时(10万+),task协程并发处理速度太快,造成数据库连接池不够用,有办法限制下速度或其它方式来处理? 已尝试: 1. 提取mysql连接池前强行while sleep等待池空闲。 (大量协程空转) 2.收到task向协程Channel push,pop消费+co::sleep减速. (因协程下的co::sleep,所以使用$serv->getWorkerStatus判断taskWorker状态后投递并不严谨) 3.关闭task_enable_coroutine使用同步task方式 (task下很多协程功能无法使用) ### Swoole版本,PHP版本,以及操作系统版本信息 Swoole版本: 4.7.1 PHP版本: PHP 7.2.34 (cli) (built: Oct 1 2020 13:37:37) ( NTS ) 操作系统版本: CentOS Linux release 7.9.2009 (Core) ### 相关代码 ``` server配置: worker_num = 16 task_worker_num =16 enable_coroutine = true task_enable_coroutine = true 协程配置: Co::set(['hook_flags'=> SWOOLE_HOOK_CURL | SWOOLE_HOOK_TCP]); ``` ### 你期待的结果是什么?实际看到的错误信息又是什么? 请问是否有办法限制task处理速度或同步队列来处理mysql任务。
赞
0
分享
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
评论
还没有评论!
微信公众号
热门内容
作者其它话题
- windows版swoole-cli 函数 shell_exec Unable to execute
暂无回复的问答
- CodeGalaxy K3s 轻量集群节点之间如何实现负载均衡
- 关于openssl CURL WARNING swSSL_connect: SSL_connect(fd=69) failed. Error: error:141A318A:SSL routines:tls_process_ske_dhe:dh key too small[1|394]
- 多个模型如何进行事务异常回退?
- websocket开启wss报错
- 协程tcp服务器如何使用多进程?recv()方法接收信息,打印出来的pid一直是同一个。没用使用到多进程啊。