swoole中task阻塞会有什么影响,如何解决或避免阻塞
Admin 2022-07-21 群英技术资讯 1541 次浏览
这篇文章给大家介绍了“swoole中task阻塞会有什么影响,如何解决或避免阻塞”的相关知识,讲解详细,步骤过程清晰,有一定的借鉴学习价值,因此分享给大家做个参考,感兴趣的朋友接下来一起跟随小编看看吧。
如果有仔细看过 swoole task 的文档的话,应该都会注意到这句话
task操作的次数必须小于onTask处理速度,如果投递容量超过处理能力,task会塞满缓存区,导致worker进程发生阻塞。
worker进程将无法接收新的请求 (推荐学习: swoole视频教程)
task 如果阻塞会引发 woker 进程阻塞,造成服务无法工作,引发问题。
我曾经使用 task 发送服务的链路日志,接收日志的服务出现bug,造成发送日志的 task 阻塞,然后服务 gg 的情况,之后我就对 task 做了一波优化。
思路就是使用 swoole channel 和 swoole user process 实现一套 task 。
使用 channel 接收数据,然后在 user process 消费数据,假如 channel 满了仅仅会造成 push 数据失败,并不会引发阻塞,因为是链路日志,是允许丢失的,所以这个方案完全没问题。
在swoole user process 消费 channel 的策略的伪代码如下
$sleepTime = 5;
$maxSleepTime = 100;
while (true) {
$task = $chan->pop();
if ($task === false) {
$sleepTime = $sleepTime + 5;
if ($sleepTime > $maxSleepTime) {
$sleepTime = $maxSleepTime;
}
usleep($sleepTime * 1000);
continue;
}
$sleepTime = 0;
// 处理数据
}如果消费到channel的数据,就使用死循环处理数据,因为处理数据过程中是有其他操作的,所以并不会占用大量 cpu。
如果消费不到数据,就 sleep 5ms,sleep的时间依次累加,直到达到最大值 100ms,达到 cpu 使用率和处理数据实时性的一个平衡,具体平衡点可以根据自己的业务按需调整。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
本文实例讲述了PHP设计模式:装饰器模式Decorator。下文有实例供大家参考,对大家了解操作过程或相关知识有一定的帮助,而且实用性强,希望这篇文章能帮助大家,下面我们一起来了解看看吧。
PHP使用fread()操作字节:分为1、确认需要读取的字节。2、不确认需要读取的字节,若要获得文件的文件的所有内容,需要使用另一个函数filesize()函数来查看文件的大小。
这篇文章主要介绍了Laravel框架Eloquent ORM修改数据操作,结合实例形式详细分析了laravel框架更新数据的两种常见操作技巧,需要的朋友可以参考下
swoole使用心跳机制判断fd是否连接,客户端定时发送一个心跳包,告诉服务器我还活着,服务器定时检测所有客户端列表,看他们最后一个心跳包的时间是否过长,如果过长,则认为已无心跳,判定为死连接,主动关闭这个连接。
很多朋友问php扩展安装方法,下面就给大家php扩展安装方法步骤,本文也有详细的步骤介绍,对这方面有需求的朋友可以看一看,希望大家能有所收获。
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008