首页
下载
文档
问答社区
视频
捐赠
源代码
AI 助理
赞助商
CRMEB
Apipost
腾讯云
微擎
禅道
51Talk
商业产品
Swoole AI 智能文档翻译器
Swoole-Compiler PHP 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
关于协程环境下多协程同时sleep同一时间,唤醒顺序不理解的问题
### 问题描述 执行下面代码每次输出Cid都是相同的 1,6,5,4,3,2 由于使用sleep模拟阻塞一秒,循环创建的6个协程按道理也应该是按创建顺序被唤醒,所以理论输出应该是FIFO,1,2,3,4,5,6,但是实际却是协程1还是第一个输出,但是后面的顺序变成了FILO,希望大佬能解释一下这是为什么。 ```php hello main 1630473168.7905 Cid:1 1630473168.7906 Cid:6 1630473168.7907 Cid:5 1630473168.7907 Cid:4 1630473168.7907 Cid:3 1630473168.7908 Cid:2 ``` ### Swoole版本,PHP版本,以及操作系统版本信息 PHP 7.3.25 (cli) (built: Apr 16 2021 17:41:06) ( NTS ) php --ri swoole swoole Swoole => enabled Author => Swoole Team <team@swoole.com> Version => 4.5.11 MacOS 10.13.6 High Sierra ### 相关代码 ```php <?php $n = 6; for ($i = 0; $i < $n; $i++) { \Swoole\Coroutine::create(function () use ($i) { // 模拟 IO 等待 \Swoole\Coroutine::sleep(1); //echo \Swoole\Coroutine::getCid() . PHP_EOL; //file_put_contents('./test.log', microtime(true) . ": hello $i " . PHP_EOL, FILE_APPEND); echo microtime(true) . PHP_EOL. 'Cid:' . \Swoole\Coroutine::getCid() . PHP_EOL; }); }; echo "hello main \n"; ``` ### 你期待的结果是什么? 期待的结果输出是1,2,3,4,5,6顺序输出
发布于3年前 · 26 次浏览 · 来自
提问
牧之
### 问题描述 执行下面代码每次输出Cid都是相同的 1,6,5,4,3,2 由于使用sleep模拟阻塞一秒,循环创建的6个协程按道理也应该是按创建顺序被唤醒,所以理论输出应该是FIFO,1,2,3,4,5,6,但是实际却是协程1还是第一个输出,但是后面的顺序变成了FILO,希望大佬能解释一下这是为什么。 ```php hello main 1630473168.7905 Cid:1 1630473168.7906 Cid:6 1630473168.7907 Cid:5 1630473168.7907 Cid:4 1630473168.7907 Cid:3 1630473168.7908 Cid:2 ``` ### Swoole版本,PHP版本,以及操作系统版本信息 PHP 7.3.25 (cli) (built: Apr 16 2021 17:41:06) ( NTS ) php --ri swoole swoole Swoole => enabled Author => Swoole Team <team@swoole.com> Version => 4.5.11 MacOS 10.13.6 High Sierra ### 相关代码 ```php <?php $n = 6; for ($i = 0; $i < $n; $i++) { \Swoole\Coroutine::create(function () use ($i) { // 模拟 IO 等待 \Swoole\Coroutine::sleep(1); //echo \Swoole\Coroutine::getCid() . PHP_EOL; //file_put_contents('./test.log', microtime(true) . ": hello $i " . PHP_EOL, FILE_APPEND); echo microtime(true) . PHP_EOL. 'Cid:' . \Swoole\Coroutine::getCid() . PHP_EOL; }); }; echo "hello main \n"; ``` ### 你期待的结果是什么? 期待的结果输出是1,2,3,4,5,6顺序输出
赞
0
分享
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
评论
2021-10-19
Rango
这个比较复杂,是因为`sleep`底层实现使用定时器,定时器使用最小堆数据结构进行存储,相同执行时间的定时器数据结构是不保证有序的。 你可以试试调整为`sleep`不同的时间。
赞
0
回复
微信公众号
热门内容
作者其它话题
- 关于golang多线程协程和swoole单线程协程的思考
暂无回复的问答
- 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一直是同一个。没用使用到多进程啊。