Home
Document
Q&A
Video
Donate
Source Code
Code-Galaxy 云原生平台
Business
Swoole Tracker
Swoole Compiler
Login
Register
全部
提问
分享
讨论
建议
公告
开发框架
发表新帖
协程与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 的初始值,这样协程数很多,会有问题嘛? 感谢回复!
发布于7月前 · 36 次浏览 · 来自
提问
埃贝赫
现有需求:从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
分享
收藏
提问
分享
讨论
建议
公告
开发框架
评论
2022-01-06
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-10
掸尘
mark
赞
0
回复
微信公众号
热门内容
- swoole针对400的请求--TRACE Port_onRead_http() (ERRNO 7102): Bad Request: unknown protocol from session#193 on 0.0.0.0:9505
- 基于Swoole+PHP的超高性能短信网关(CMPP、SMPP)模拟器
- http服务中,使用write分段输出文件。设置header总文件长度无用
- Call to undefined function Swoole\Coroutine\run() 是怎么回事啊?
- Swoole Loader扩展 如何下载,https://business.swoole.com/trial/download/ 404
- 请教当使用request主动推送的时候,产生新的连接,及会马上关闭连接问题
- 为什么连接池只创建一个连接
- timer定时器,启动一下,突然执行了1万多次,这是怎么回事呢?
- 在swoole 中, 使用地址引用自身,造成内存增加
- windows 配置wss链接,链接不成功
暂无回复的问答
- 关于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]
- 请问那个一键协程化的代码是放外面还是set里面
- 多个模型如何进行事务异常回退?
- websocket开启wss报错
- 协程tcp服务器如何使用多进程?recv()方法接收信息,打印出来的pid一直是同一个。没用使用到多进程啊。