php如何退出while (true),while(true)导致协程不会立即退出

这篇博客讨论了在PHP Swoole 4.5.5版本下,使用`while(true)`循环的协程遇到的一个问题:ffmpeg子进程不会立即退出,而是等到下一个协程创建时才退出。作者提供了复现代码,展示了如何在协程中启动ffmpeg进程,并尝试通过`Channel`关闭进程。期望的结果是协程能够立即退出,但实际观察到的是延迟退出的现象。
摘要由CSDN通过智能技术生成

### 问题描述

while(true)协程不会立即退出

### Swoole版本,PHP版本,以及操作系统版本信息

PHP 7.4.7 (cli) (built: Jun 12 2020 00:04:10) ( NTS )

swoole

Swoole => enabled

Author => Swoole Team

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

//复现代码

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){

}

});

```

### 你期待的结果是什么?实际看到的错误信息又是什么?

协程立即退出。我看到协程不会立即退出,等创建下一个协程的时候上一个才退出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值