什么?Python Celery 也能调度Go worker?!
我们曾经研究过如何让Python和Go互相调度,当时发现,将Go语言写的模块打包成动态链接库,就能在Python中进行调度:
Go的优势很明显,从1亿减到1,在我的设备上测试,用Go运行只需要50ms,Python可能需要接近100倍的时间。
但是,这种写法也有缺点:实在太麻烦了,大大增加了整个项目的耦合性。
那Python中有没有办法不通过打包成动态链接库的方法,用Python调度Go的任务呢?答案是Go celery.
https://github.com/gocelery/gocelery
我们可以用Go写一个计算密集型任务的Worker,然后用Python的Celery beat来调度这个Worker,下面给大家演示一下:
1.编写Go Worker
最好是将计算密集型的任务改造成Go语言版的,这样收益才能最大化。
比如这里,我使用的是上回从1亿减到1的老梗。
PS,别被下面这段代码吓到了,其实大部分是可以去掉的配置项,核心代码就几行。
输入命令:
go run main.go
即可运行该worker
2.编写Python客户端
每5秒调度一次1亿减到1,不过不跑Python worker. 由于Go Worker在运行,这里的minus会被Go Worker消费。
另外请注意,这里的minus函数实际上只是为了能被识别到而编写的,其内容毫无意义,直接写个pass都没问题(因为实际上是Go Worker在消费)。
编写完后,针对go_tasks模块启动beat:
celery -A go_tasks beat
此时,调度器就会调度Go Worker执行任务:
可以看到,我们成功用Python的Celery Beat调度了Go写的Worker!可喜可贺。
接下来可以看看如果单纯用Python的Worker做这样的计算是有多耗时:
启动worker:
celery worker -A python_tasks -l info --pool=eventlet
启动beat调度器:
celery -A python_tasks beat
结果如下:
可以看到,Python从1亿减到1平均需要5.2秒左右的时间,和Go版相差了100倍左右。
如果我们将调度器的频率提高到每秒计算1次,Python版的Worker,其任务队列一定会堵塞,因为Worker消费能力不够强大。相比之下,Go版的Worker可就非常给力了。
因此,如果你的项目中有这种计算密集型的任务,可以尝试将其提取成Go版本试试,说不定有惊喜呢。
我们的文章到此就结束啦,如果你喜欢今天的Python 实战教程,请持续关注Python实用宝典。
有任何问题,可以在公众号后台回复:加群,回答二维码上相应的验证信息,进入互助群询问。
原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!
点击下方阅读原文可获得更好的阅读体验
Python实用宝典 (pythondict.com)
不只是一个宝典
本文分享自微信公众号 - Python实用宝典(pythondict)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
使用多尺度空间注意力的语义分割方法
点击上方“AI公园”,关注公众号,选择加“星标“或“置顶” 作者:Abhinav Sagar 编译:ronghuaiyang 导读 用于自动驾驶的新的state of the art的网络。 本文提出了一种新的神经网络,利用不同尺度的多尺度特征融合来实现精确高效的语义分割。 重点 我们在下采样部分使用了膨胀卷积层,在上采样部分使用了转置卷积层,并在concat层中对它们进行拼接。 alternate blocks之间有跳跃连接,这有助于减少过拟合。 我们对我们的网络训练和优化细节进行了深入的理论分析。 我们在Camvid数据集上使用每个类的平均精度和IOU作为评价指标来评估我们的网络。 我们的模型在语义分割上优于之前的state of the art网络,在超过100帧每秒的速度下,平均IOU值为74.12。 语义分割 语义分割需要对输入图像的每个像素预测一个类,而不是对整个输入图像进行分类。为了预测图像中每个像素的内容,分割不仅需要找到输入图像中的内容,还需要找到它的位置。语义分割在自动驾驶、视频监控、医学影像等方面都有应用。这是一个具有挑战性的问题,因为要在准确性和速度之间进行权衡...
- 下一篇
喵的Unity游戏开发之路 - 帧每秒:性能衡量
前言 很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始学。 为此我们精选了一套国外优秀的Unity3D游戏开发教程,翻译整理后放送给大家,教您从零开始一步一步掌握Unity3D游戏开发。 本文不是广告,不是推广,是免费的纯干货! 本文全名:喵的Unity游戏开发之路 - 基础 - 性能衡量 -帧每秒 帧每秒 性能衡量 使用物理学来创建不断增长的原子核。 使用探查器调查性能。 测量并显示帧频。 防止创建临时字符串。 通过平均多个帧来稳定帧速率。 对帧频显示着色。 在本教程中,我们将创建一个简单的测试场景,然后测量其性能。我们将首先检查分析器,然后创建自己的帧速率计数器。 本教程需要基本了解Unity中的脚本。它适用于Unity 5.0.1及更高版本。如果您是新手,请先看看构建全彩随机3D分形。 将球体粉碎在一起,直到帧速率降低。 建立原子核 我们需要一个测试场景。理想地涵盖高性能和低性能情况的一种。我建议我们通过将越来越多的核子融合在一起来创建原子核。随着细胞核变大,性能会变差。 核子将是简单的球体,将被吸引到场景的中心,在那里它们会聚成一个球。这当然不是原子的正确表示,但...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Mario游戏-低调大师作品
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果