咱们曾经研究过如何让Python和Go互相调度,当时发现,将Go语言写的模块打包成动态连接库,就能在Python中进行调度:python
Go的优点很明显,从1亿减到1,在个人设备上测试,用Go运行只须要50ms,Python可能须要接近100倍的时间。git
可是,这种写法也有缺点:实在太麻烦了,大大增长了整个项目的耦合性。github
那Python中有没有办法不经过打包成动态连接库的方法,用Python调度Go的任务呢?答案是Go celery.微信
https://github.com/gocelery/goceleryapp
咱们能够用Go写一个计算密集型任务的Worker,而后用Python的Celery beat来调度这个Worker,下面给你们演示一下:函数
1.编写Go Worker
最好是将计算密集型的任务改形成Go语言版的,这样收益才能最大化。测试
好比这里,我使用的是上回从1亿减到1的老梗。spa
PS,别被下面这段代码吓到了,其实大部分是能够去掉的配置项,核心代码就几行。.net
输入命令:
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源创计划”,欢迎正在阅读的你也加入,一块儿分享。