0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何讓Python和Go互相調(diào)度

科技綠洲 ? 來源:Python實(shí)用寶典 ? 作者:Python實(shí)用寶典 ? 2023-11-02 11:24 ? 次閱讀

我們?cè)?jīng)研究過如何讓Python和Go互相調(diào)度,當(dāng)時(shí)發(fā)現(xiàn),將Go語(yǔ)言寫的模塊打包成動(dòng)態(tài)鏈接庫(kù),就能在Python中進(jìn)行調(diào)度:

優(yōu)劣互補(bǔ)! Python+Go結(jié)合開發(fā)的探討

Go的優(yōu)勢(shì)很明顯,從1億減到1,在我的設(shè)備上測(cè)試,用Go運(yùn)行只需要50ms,Python可能需要接近100倍的時(shí)間。

但是,這種寫法也有缺點(diǎn):實(shí)在太麻煩了,大大增加了整個(gè)項(xiàng)目的耦合性。

那Python中有沒有辦法不通過打包成動(dòng)態(tài)鏈接庫(kù)的方法,用Python調(diào)度Go的任務(wù)呢?答案是Go celery.

https://github.com/gocelery/gocelery

我們可以用Go寫一個(gè)計(jì)算密集型任務(wù)的Worker,然后用Python的Celery beat來調(diào)度這個(gè)Worker,下面給大家演示一下:

1.編寫Go Worker

最好是將計(jì)算密集型的任務(wù)改造成Go語(yǔ)言版的,這樣收益才能最大化。

比如這里,我使用的是上回從1億減到1的老梗。

PS,別被下面這段代碼嚇到了,其實(shí)大部分是可以去掉的配置項(xiàng),核心代碼就幾行。

圖片

輸入命令:

go run main.go

即可運(yùn)行該worker

2.編寫Python客戶端

圖片

每5秒調(diào)度一次1億減到1,不過不跑Python worker. 由于Go Worker在運(yùn)行,這里的minus會(huì)被Go Worker消費(fèi)。

另外請(qǐng)注意,這里的minus函數(shù)實(shí)際上只是為了能被識(shí)別到而編寫的,其內(nèi)容毫無(wú)意義,直接寫個(gè)pass都沒問題(因?yàn)閷?shí)際上是Go Worker在消費(fèi))。

編寫完后,針對(duì)go_tasks模塊啟動(dòng)beat:

celery -A go_tasks beat

此時(shí),調(diào)度器就會(huì)調(diào)度Go Worker執(zhí)行任務(wù):

圖片

圖片

可以看到,我們成功用Python的Celery Beat調(diào)度了Go寫的Worker!可喜可賀。

接下來可以看看如果單純用Python的Worker做這樣的計(jì)算是有多耗時(shí):

圖片

啟動(dòng)worker:

celery worker -A python_tasks -l info --pool=eventlet

啟動(dòng)beat調(diào)度器:

celery -A python_tasks beat

結(jié)果如下:

圖片

可以看到,Python從1億減到1平均需要5.2秒左右的時(shí)間,和Go版相差了100倍左右。

如果我們將調(diào)度器的頻率提高到每秒計(jì)算1次,Python版的Worker,其任務(wù)隊(duì)列一定會(huì)堵塞,因?yàn)閃orker消費(fèi)能力不夠強(qiáng)大。相比之下,Go版的Worker可就非常給力了。

因此,如果你的項(xiàng)目中有這種計(jì)算密集型的任務(wù),可以嘗試將其提取成Go版本試試,說不定有驚喜呢。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Go
    Go
    +關(guān)注

    關(guān)注

    0

    文章

    43

    瀏覽量

    12255
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4797

    瀏覽量

    84690
  • Worker
    +關(guān)注

    關(guān)注

    0

    文章

    8

    瀏覽量

    6464
  • 動(dòng)態(tài)鏈接庫(kù)

    關(guān)注

    0

    文章

    11

    瀏覽量

    7066
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Go語(yǔ)言開發(fā)有什么優(yōu)勢(shì)?怎么學(xué)?

    ?! ?. 部署簡(jiǎn)單。Go 編譯生成的是一個(gè)靜態(tài)可執(zhí)行文件,除了glibc 外沒有其他外部依賴。這部署變得異常方便:目標(biāo)機(jī)器上只需要一個(gè)基礎(chǔ)的系統(tǒng)和必要的管理、監(jiān)控工具,完全不需要操心應(yīng)用所需的各種包
    發(fā)表于 12-19 16:08

    Go開發(fā)語(yǔ)言的優(yōu)勢(shì)在哪里?

    Go語(yǔ)言是谷歌發(fā)布的第二款開源編程語(yǔ)言,可以在不損失應(yīng)用程序性能的情況下降低代碼的復(fù)雜性,并專門針對(duì)多處理器系統(tǒng)應(yīng)用程序的編程進(jìn)行了優(yōu)化,開發(fā)速度極快,可以與C或C++媲美,而且更加安全、支持并行
    發(fā)表于 03-22 15:04

    python2和python3是如何互相切換的

    python2和python3互相切換在本地有兩個(gè)Python的版本:默認(rèn)使用Python2.7:可以這樣查看當(dāng)前版本:如果要使用
    發(fā)表于 07-12 07:53

    Python 轉(zhuǎn)向 Go語(yǔ)言的9大原因和3大缺點(diǎn)

    轉(zhuǎn)用一門新語(yǔ)言通常是一項(xiàng)大決策,尤其是當(dāng)你的團(tuán)隊(duì)成員中只有一個(gè)使用過它時(shí)。今年 Stream 團(tuán)隊(duì)的主要編程語(yǔ)言從 Python 轉(zhuǎn)向了 Go。本文解釋了其背后的九大原因以及如何做好這一轉(zhuǎn)換。
    發(fā)表于 06-17 07:40 ?6822次閱讀

    GoPython,Erlang的語(yǔ)言對(duì)比分析和Go編程示例概述

    本文對(duì)GoPython、Erlang做了一些有趣的分析對(duì)比,相信大家能從中感受到Go語(yǔ)言的強(qiáng)大和與眾不同。
    的頭像 發(fā)表于 07-21 09:52 ?7732次閱讀
    <b class='flag-5'>Go</b>和<b class='flag-5'>Python</b>,Erlang的語(yǔ)言對(duì)比分析和<b class='flag-5'>Go</b>編程示例概述

    Go語(yǔ)言其實(shí)有很多優(yōu)良特性,很多時(shí)候都可以代替Python

    Go 要想撼動(dòng)編程界的常青樹 Java 二十多年的地位無(wú)疑難度頗大。據(jù) HackerRank 數(shù)據(jù)顯示,2018 年,Java 在開發(fā)者最受歡迎的編程語(yǔ)言排行榜中仍然排名第 2,Python 排名第 4,Go 排名第 13,
    的頭像 發(fā)表于 02-13 10:01 ?4732次閱讀

    golang的調(diào)度模型-GPM 模型的源碼結(jié)構(gòu)

    【導(dǎo)讀】GMP 模型是 go 語(yǔ)言輕量快速高效的重要調(diào)度模型,本文從 GMP 源碼出發(fā)直觀地解析了這一模型。 這篇文章就來看看 golang 的調(diào)度模型-GPM 模型的源碼結(jié)構(gòu)。
    的頭像 發(fā)表于 07-06 11:55 ?2207次閱讀

    詳解剖析Go語(yǔ)言調(diào)度模型的設(shè)計(jì)

    golang的MPG調(diào)度模型是保障Go語(yǔ)言效率高的一個(gè)重要特性,本文詳細(xì)介紹了Go語(yǔ)言調(diào)度模型的設(shè)計(jì)。 前言 Please remember that at the end of th
    的頭像 發(fā)表于 07-26 10:12 ?2088次閱讀
    詳解剖析<b class='flag-5'>Go</b>語(yǔ)言<b class='flag-5'>調(diào)度</b>模型的設(shè)計(jì)

    go項(xiàng)目怎么docker鏡像體積減小

    【導(dǎo)讀】go 項(xiàng)目怎么 docker 鏡像體積減小?本文做了詳細(xì)介紹。
    的頭像 發(fā)表于 06-12 15:07 ?1416次閱讀

    go項(xiàng)目怎么docker鏡像體積減小

    go 項(xiàng)目怎么 docker 鏡像體積減小?本文做了詳細(xì)介紹。
    的頭像 發(fā)表于 06-23 10:49 ?1192次閱讀

    Go/Rust挑戰(zhàn)Java/Python地位

    編程語(yǔ)言方面,Java 和 Python 仍然遙遙領(lǐng)先,并且分別微小增長(zhǎng)了 1.7% 和 3.4%;圍繞 Go (增長(zhǎng) 20%) 和 Rust (增長(zhǎng) 22%) 的興趣則大幅增加。報(bào)告稱,如果這種
    的頭像 發(fā)表于 03-06 10:19 ?702次閱讀

    Schedule:簡(jiǎn)單實(shí)用的 Python 周期任務(wù)調(diào)度工具

    如果你想在Linux服務(wù)器上周期性地執(zhí)行某個(gè) Python 腳本,最出名的選擇應(yīng)該是 Crontab 腳本,但是 Crontab 具有以下缺點(diǎn): ** 1.不方便執(zhí)行 秒級(jí)的任務(wù)
    的頭像 發(fā)表于 10-30 11:18 ?680次閱讀

    Crontab:簡(jiǎn)單實(shí)用的Python 周期任務(wù)調(diào)度工具

    如果你想周期性地執(zhí)行某個(gè) Python 腳本,最出名的選擇應(yīng)該是 Crontab 腳本,但是 Crontab 具有以下缺點(diǎn): 1.不方便執(zhí)行 秒級(jí)任務(wù) 。 2.當(dāng)需要執(zhí)行的定時(shí)任務(wù)有上百個(gè)的時(shí)候
    的頭像 發(fā)表于 11-01 09:40 ?745次閱讀

    Go在單線程計(jì)算性能上的優(yōu)勢(shì)

    ,將計(jì)算和保存的過程保存在本地的redis緩存中,然后使用Celery來調(diào)度這些任務(wù)。 問題在于,從這些網(wǎng)址中獲取數(shù)據(jù)的步驟,寫在Go Worker里是否合適?Go進(jìn)行網(wǎng)絡(luò)請(qǐng)求是否比Pytho
    的頭像 發(fā)表于 11-02 11:16 ?489次閱讀
    <b class='flag-5'>Go</b>在單線程計(jì)算性能上的優(yōu)勢(shì)

    Go語(yǔ)言比Python強(qiáng)多少

    1.都說Go語(yǔ)言性能非常強(qiáng)大,那么到底比Python強(qiáng)多少? 為了比較Go語(yǔ)言和Python語(yǔ)言在單線程性能上的差距,我們可以做一個(gè)簡(jiǎn)單實(shí)驗(yàn),從1億減到1:
    的頭像 發(fā)表于 11-02 14:05 ?563次閱讀
    <b class='flag-5'>Go</b>語(yǔ)言比<b class='flag-5'>Python</b>強(qiáng)多少