我们曾经研究过如何让python和go互相调度,当时发现,将go语言写的模块打包成动态链接库,就能在python中进行调度:
优劣互补! python+go结合开发的探讨
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版本试试,说不定有惊喜呢。
5G技术如何助力企业应对新常态?
蔡司三坐标保证30年精度不变
LGD广州厂进入设备订单阶段,明年下半年或将量产
基于MSP430单片机的微功耗中文人机界面设计
延续经典创造革新,Nank 南卡S2震撼上市,引领游戏运动耳机新潮流!
如何让Python和Go互相调度
新能源车送上海牌照,上海买新能源车怎么上牌?
电源和电话滤波器电路
区块链技术怎样回归它的本源
智能家居常用传感器的使用安装注意事项
ATI Mobility Radeon 9200显示芯片
新能源汽车高压线束设计指南
2020对于人工智能有什么机会
这9种工作不会被人工智能取代 目前非常难以实现自动化
全球首个AI宇宙三维模拟器,可在几毫秒内完成模拟
华为Mate X2再爆新消息
i.MX RT1170:VGLite移植RT-Thread Nano过程讲解(下)
KNX总线和RS485总线的区别是什么
针对手机应用的DCA系列天线
iOS10.3 Beta4发布:耗电、流畅性如何?