swoole task会阻塞么

发布时间 - 2019-12-16 00:00:00    点击率:

如果有仔细看过 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 使用率和处理数据实时性的一个平衡,具体平衡点可以根据自己的业务按需调整。


# swoole  # 循环  # channel  # bug  # 链路  # 自己的  # 是有  # 这句话  # 注意到  # 满了  # 可以根据  # 就对  # 一波  # 过程中 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  中山网站制作网页,中山新生登记系统登记流程?  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法  如何快速生成凡客建站的专业级图册?  Laravel如何自定义错误页面(404, 500)?(代码示例)  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  javascript如何操作浏览器历史记录_怎样实现无刷新导航  Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】  高端云建站费用究竟需要多少预算?  微信小程序 scroll-view组件实现列表页实例代码  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  Laravel怎么使用artisan命令缓存配置和视图  如何在阿里云完成域名注册与建站?  如何为不同团队 ID 动态生成多个独立按钮  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  Python文件异常处理策略_健壮性说明【指导】  如何用低价快速搭建高质量网站?  Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门  制作旅游网站html,怎样注册旅游网站?  如何在IIS中配置站点IP、端口及主机头?  制作公司内部网站有哪些,内网如何建网站?  Laravel如何实现全文搜索功能?(Scout和Algolia示例)  HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  Laravel如何优化应用性能?(缓存和优化命令)  Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】  Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  什么是javascript作用域_全局和局部作用域有什么区别?  使用Dockerfile构建java web环境  Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧  python中快速进行多个字符替换的方法小结  Python图片处理进阶教程_Pillow滤镜与图像增强  laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程  桂林网站制作公司有哪些,桂林马拉松怎么报名?  Laravel如何处理CORS跨域请求?(配置示例)  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  Android仿QQ列表左滑删除操作  非常酷的网站设计制作软件,酷培ai教育官方网站?  JS弹性运动实现方法分析  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点  标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南  高端企业智能建站程序:SEO优化与响应式模板定制开发  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  Python自动化办公教程_ExcelWordPDF批量处理案例  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议  Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】