咱們曾經研究過如何讓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源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。