Closed yuntian001 closed 3 years ago
- push设置了超时时间,没有pop,到达时间后就会发生超时,底层会恢复当前协程,push 调用会返回 false,并设置错误码为-1 (SWOOLE_CHANNEL_TIMEOUT)
- push 设置了 -1,没有pop,那么协程挂起,这个协程确实是有问题的。
push 设置了 -1或者0 没有pop 现在抛异常这个是属于bug,还是就这样设计的。
4.6新加的功能,协程死锁检测,可以手动关闭。 https://wiki.swoole.com/#/coroutine/coroutine?id=set
use Swoole\Coroutine;
use Swoole\Coroutine\Channel;
use function Swoole\Coroutine\run;
Coroutine::set(['enable_deadlock_check' => false]);
run(function(){
$channel = new Channel(1);
Coroutine::create(function () use ($channel) {
$timeOut = 0;
$channel->push(['rand' => rand(1000, 9999),'number'=>1]);
echo "协程1第一次入通道\n";
echo "协程1检测通道状态:is full\n";
var_dump($channel->isFull());
echo "协程1第二次入通道:\n";
$res = $channel->push(['rand' => rand(1000, 9999),'number'=>2], $timeOut);
echo "协程1第二次入通道结果:\n";
var_dump($res);
echo "协程1第三次入通道:\n";
$res = $channel->push(['rand' => rand(1000, 9999),'number'=>3], $timeOut);
echo "协程1第三次入通道结果:\n";
var_dump($res);
});
Coroutine::create(function () use ($channel) {
echo "协程2\n";
\Swoole\Coroutine\System::sleep(5);
echo "协程2 5秒后\n";
$data = $channel->pop();
echo "协程2第一次挂起后收到数据:\n";
var_dump($data);
\Swoole\Coroutine\System::sleep(5);
echo "协程2 10秒后\n";
});
\Swoole\Coroutine::create(function (){
echo "协程3\n";
});
});
Coroutine::set(['enable_deadlock_check' => false]);
多谢,已了解。
https://wiki.swoole.com/#/coroutine/channel?id=push
实际内容: push() 向通道中写入数据。 $timeout参数的介绍
float $timeout 功能:设置超时时间 值单位:秒【支持浮点型,如 1.5 表示 1s+500ms】 默认值:-1 其它值:无 版本影响:Swoole 版本 >= v4.2.12 在通道已满的情况下,push 会挂起当前协程,在约定的时间内,如果没有任何消费者消费数据,将发生超时,底层会恢复当前协程,push 调用立即返回 false,写入失败
并没有对默认值-1和特殊值0做介绍,建议加上。
期望内容: 建议加上 -1 和0的说明 笔者测试后发现当$timeout设置为大于0的数后,会在规定的时间恢复协程返回并写入失败(返回false)。 -1或者0后如果写入失败会直接报下面错误,不会向下继续执行
笔者猜测 -1或者0 都是不超时,但会在所有程序运行结束后检测通道待写入队列是否有数据,有则抛出异常,而大于0时应该是超时后回滚了待写入队列,检测后不会触发异常 下面是笔者的测试代码: