博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
swoole之协程channel元素个数
阅读量:5819 次
发布时间:2019-06-18

本文共 1164 字,大约阅读时间需要 3 分钟。

前言

channel用于进程内跨协程通讯,按照角色分为生产协程和消费协程。

生产协程,在channel已满时,会被挂起;
消费协程,在channel为空是,也会被挂起。

看例子

push([__METHOD__ => __LINE__]);}function t5(\Swoole\Coroutine\Channel $chan){ Co::sleep(0.005); $chan->push([__METHOD__ => __LINE__]);}go("t4", $chan);go("t5", $chan);go(function () use ($chan) { // chan元素个数 $chanNum = 1; while ($chanNum > 0) { $item = $chan->pop(); var_dump($item); $chanNum--; }});

分析

上面的例子,如果赋值$chanNum=1,会导致channel中有数据未被消费;

如果赋值$chanNum=3,由于channel数据不足,消费协程会挂起,程序无法正常退出。

准确设置channel元素个数,是很重要的事。

实践中,有些场景无法预测channel元素个数(例如请求第三方接口,如果有数据则push到channel,无数据则不push),那有什么解决办法嘛?
有!

保证生产者协程不挂起的前提下,在php的register_shutdown_function()函数中,去实现未完成的消费者功能

stats()["queue_num"]; for($i=0;$i<$queue_num;$i++) { var_dump($chan->pop()); } });});

这个办法能解决问题,但是显然不是那么优雅,在register_shutdown_function()中处理,也只是临时解决办法

总结

协程channel的push/pop机制,决定了需要设置一个合理的channel元素个数。

实践中某些场景,又无法准确评估这个值,只能用临时办法解决,希望swoole能提供更优雅的解决方式。

后记

由于协程的非顺序化处理,channel元素个数的评估是无法实现的。

基于此,通过约定来规避此类问题:
每个生产者协程的结果需要push到channel里,生产者个数=channel元素个数;
消费者协程只有一个,且出现在所有的生产者协程后,可以正确读取到生产者协程个数
读取生产者协程个数Co::stats()或者Coroutine::listCoroutines

Refer:

转载地址:http://gkzdx.baihongyu.com/

你可能感兴趣的文章
Valid Parentheses
查看>>
AIX 配置vncserver
查看>>
windows下Python 3.x图形图像处理库PIL的安装
查看>>
【IL】IL生成exe的方法
查看>>
SettingsNotePad++
查看>>
没有JS的前端:体积更小、速度更快!
查看>>
数据指标/表现度量系统(Performance Measurement System)综述
查看>>
GitHub宣布推出Electron 1.0和Devtron,并将提供无限制的私有代码库
查看>>
论模式在领域驱动设计中的重要性
查看>>
有关GitHub仓库分支的几个问题
查看>>
云原生的浪潮下,为什么运维人员适合学习Go语言?
查看>>
EAServer 6.1 .NET Client Support
查看>>
锐捷交换机密码恢复(1)
查看>>
Method Swizzling对Method的要求
查看>>
佛祖保佑,永不宕机
查看>>
四、配置开机自动启动Nginx + PHP【LNMP安装 】
查看>>
Linux 目录结构及内容详解
查看>>
OCP读书笔记(24) - 题库(ExamD)
查看>>
解决Unable to load R3 module ...VBoxDD.dll (VBoxDD):GetLastError=1790
查看>>
.net excel利用NPOI导入oracle
查看>>