首页
下载
文档
问答社区
视频
捐赠
源代码
AI 助理
赞助商
CRMEB
Apipost
腾讯云
微擎
禅道
51Talk
商业产品
Swoole AI 智能文档翻译器
Swoole-Compiler PHP 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
while(true)导致协程不会立即退出
### 问题描述 while(true)协程不会立即退出 ### Swoole版本,PHP版本,以及操作系统版本信息 PHP 7.4.7 (cli) (built: Jun 12 2020 00:04:10) ( NTS ) swoole Swoole => enabled Author => Swoole Team <team@swoole.com> Version => 4.5.5 Built => Oct 22 2020 13:07:00 coroutine => enabled kqueue => enabled rwlock => enabled openssl => OpenSSL 1.1.1g 21 Apr 2020 http2 => enabled pcre => enabled zlib => 1.2.11 brotli => E16777223/D16777223 async_redis => enabled ### 相关代码 ```php <?php //复现代码 use Swoole\Coroutine\Channel; Co::set(['hook_flags'=> SWOOLE_HOOK_ALL]); Co\run(function(){ function aa($data, $fd){ if (empty($GLOBALS['ffmpeg'][$fd])){ echo 'process'."\n"; $Channel = new Channel(); $GLOBALS['ffmpeg'][$fd] = &$Channel; $shell = '/usr/local/bin/ffmpeg -f alaw -ar 8000 -ac 1 -i - -c:a aac -f flv -'; go(function () use($Channel, $shell){ defer(function (){ echo "退出携程\n"; }); $descriptorspec = [ 0 => ['pipe', 'r'], 1 => ['pipe', 'w'], 2 => ['file', '/tmp/aa2s.txt', 'a'], ]; $process = proc_open($shell, $descriptorspec, $pipes); stream_set_blocking($pipes['1'], false); while ($data = $Channel->pop()){ // fwrite($pipes[0], $data); // fread($pipes[1], 1024); } fclose($pipes[0]); fclose($pipes[1]); proc_close($process); echo '进程结束'."\n"; }); $GLOBALS['ffmpeg'][$fd]->push($data); }else{ $GLOBALS['ffmpeg'][$fd]->push($data); } } for ($i=0; $i < 10000; $i++) { aa('11', 1); $GLOBALS['ffmpeg'][1]->close(); } while(true){ } }); ``` ### 你期待的结果是什么?实际看到的错误信息又是什么? 协程立即退出。我看到协程不会立即退出,等创建下一个协程的时候上一个才退出
发布于4年前 · 6 次浏览 · 来自
提问
孤、
### 问题描述 while(true)协程不会立即退出 ### Swoole版本,PHP版本,以及操作系统版本信息 PHP 7.4.7 (cli) (built: Jun 12 2020 00:04:10) ( NTS ) swoole Swoole => enabled Author => Swoole Team <team@swoole.com> Version => 4.5.5 Built => Oct 22 2020 13:07:00 coroutine => enabled kqueue => enabled rwlock => enabled openssl => OpenSSL 1.1.1g 21 Apr 2020 http2 => enabled pcre => enabled zlib => 1.2.11 brotli => E16777223/D16777223 async_redis => enabled ### 相关代码 ```php <?php //复现代码 use Swoole\Coroutine\Channel; Co::set(['hook_flags'=> SWOOLE_HOOK_ALL]); Co\run(function(){ function aa($data, $fd){ if (empty($GLOBALS['ffmpeg'][$fd])){ echo 'process'."\n"; $Channel = new Channel(); $GLOBALS['ffmpeg'][$fd] = &$Channel; $shell = '/usr/local/bin/ffmpeg -f alaw -ar 8000 -ac 1 -i - -c:a aac -f flv -'; go(function () use($Channel, $shell){ defer(function (){ echo "退出携程\n"; }); $descriptorspec = [ 0 => ['pipe', 'r'], 1 => ['pipe', 'w'], 2 => ['file', '/tmp/aa2s.txt', 'a'], ]; $process = proc_open($shell, $descriptorspec, $pipes); stream_set_blocking($pipes['1'], false); while ($data = $Channel->pop()){ // fwrite($pipes[0], $data); // fread($pipes[1], 1024); } fclose($pipes[0]); fclose($pipes[1]); proc_close($process); echo '进程结束'."\n"; }); $GLOBALS['ffmpeg'][$fd]->push($data); }else{ $GLOBALS['ffmpeg'][$fd]->push($data); } } for ($i=0; $i < 10000; $i++) { aa('11', 1); $GLOBALS['ffmpeg'][1]->close(); } while(true){ } }); ``` ### 你期待的结果是什么?实际看到的错误信息又是什么? 协程立即退出。我看到协程不会立即退出,等创建下一个协程的时候上一个才退出
赞
0
分享
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
评论
2020-11-02
Rango
死循环不会释放程序控制权,会导致其他协程不能被调度执行。可以在`while(true)`循环中增加一个 `Co::sleep` ,睡眠一定时间,让其他协程能够得到`CPU`时间片。
赞
2
回复
2020-11-02
孤、
明白了,感谢解惑
赞
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一直是同一个。没用使用到多进程啊。