什麼?Python Celery 也能調度Go worker?!

咱們曾經研究過如何讓Python和Go互相調度,當時發現,將Go語言寫的模塊打包成動態連接庫,就能在Python中進行調度:python

優劣互補! Python+Go結合開發的探討nginx

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實用寶典

本文分享自微信公衆號 - Python實用寶典(pythondict)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索