首页
下载
文档
问答社区
视频
捐赠
源代码
AI 助理
赞助商
CRMEB
Apipost
腾讯云
微擎
禅道
51Talk
商业产品
Swoole AI 智能文档翻译器
Swoole-Compiler PHP 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
协程与wile(true)如何处理?
现有需求:从es查库处理后存库,期间会有数据处理过程。 已经实现:es查数据存redis 队列,然后使用 swoole 协程来消费队列,代码如下: ```php <?php \Co::set(['hook_flags' => SWOOLE_HOOK_NATIVE_CURL]); \Co\run(function() use ($date, $post) { $redisConfig = config('database.redis'); $pool = new RedisPool((new RedisConfig) ->withHost($redisConfig['host']) ->withPort($redisConfig['port']) ->withAuth($redisConfig['password'] ? $redisConfig['password'] : '') ->withDbIndex($redisConfig['database']) ->withTimeout(1) ); // 10k pdo and mysqli read for ($c = 50; $c--;) { Coroutine::create(function () use ($date, $post) { $redis = $pool->get(); while($es_data = $redis->brPop('UserList', 0)) { //业务逻辑处理,存数据库 } }); } }); ``` 问题1:我在协程中使用了我wile(true) 就导致协程永远不会退出,这样会不会有什么问题? 问题2:现在速度优点慢,我除了在存数据库那一步又增加了协程处理存库的逻辑以外其他还有没有可以加快处理速度的方法? 问题3:比假设我为了加快处理速度,增加for循环中的$c 的初始值,这样协程数很多,会有问题嘛? 感谢回复!
发布于2年前 · 37 次浏览 · 来自
提问
埃贝赫
现有需求:从es查库处理后存库,期间会有数据处理过程。 已经实现:es查数据存redis 队列,然后使用 swoole 协程来消费队列,代码如下: ```php <?php \Co::set(['hook_flags' => SWOOLE_HOOK_NATIVE_CURL]); \Co\run(function() use ($date, $post) { $redisConfig = config('database.redis'); $pool = new RedisPool((new RedisConfig) ->withHost($redisConfig['host']) ->withPort($redisConfig['port']) ->withAuth($redisConfig['password'] ? $redisConfig['password'] : '') ->withDbIndex($redisConfig['database']) ->withTimeout(1) ); // 10k pdo and mysqli read for ($c = 50; $c--;) { Coroutine::create(function () use ($date, $post) { $redis = $pool->get(); while($es_data = $redis->brPop('UserList', 0)) { //业务逻辑处理,存数据库 } }); } }); ``` 问题1:我在协程中使用了我wile(true) 就导致协程永远不会退出,这样会不会有什么问题? 问题2:现在速度优点慢,我除了在存数据库那一步又增加了协程处理存库的逻辑以外其他还有没有可以加快处理速度的方法? 问题3:比假设我为了加快处理速度,增加for循环中的$c 的初始值,这样协程数很多,会有问题嘛? 感谢回复!
赞
0
分享
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
评论
2022-01-07
Rango
你需要设计一种退出机制,比如接收信号或者指令后,退出协程。 ```php $running = true; Swoole\Process::signal(SIGTERM, function () use ($running) { $running = false; }); while($running and $es_data = $redis->brPop('UserList', 0)) { //业务逻辑处理,存数据库 } ``` 协程只能解决 IO 并发的问题,如果你的程序存在大量计算逻辑,是无法通过协程解决的,可以使用 `Swoole\Process\Pool` 开多个工作进程并行处理。 多个协程可以并发请求,可以加快速度。但需要确保你的业务代码中没有阻塞 IO ,否则会导致进程阻塞。
赞
1
回复
2022-03-11
掸尘
mark
赞
0
回复
微信公众号
热门内容
暂无回复的问答
- 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一直是同一个。没用使用到多进程啊。