0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何让Python和Go互相调度

科技绿洲 ? 来源:Python实用宝典 ? 作者:Python实用宝典 ? 2023-11-02 11:24 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

我们曾经研究过如何让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版本试试,说不定有惊喜呢。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Go
    Go
    +关注

    关注

    0

    文章

    45

    浏览量

    12405
  • python
    +关注

    关注

    56

    文章

    4828

    浏览量

    87104
  • Worker
    +关注

    关注

    0

    文章

    8

    浏览量

    6598
  • 动态链接库
    +关注

    关注

    0

    文章

    11

    浏览量

    7142
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Go语言开发有什么优势?怎么学?

    。  1. 部署简单。Go 编译生成的是一个静态可执行文件,除了glibc 外没有其他外部依赖。这部署变得异常方便:目标机器上只需要一个基础的系统和必要的管理、监控工具,完全不需要操心应用所需的各种包
    发表于 12-19 16:08

    python2和python3是如何互相切换的

    python2和python3互相切换在本地有两个Python的版本:默认使用Python2.7:可以这样查看当前版本:如果要使用
    发表于 07-12 07:53

    Go绑定实例理解TensorFlow

    本文通过一个简单的Go绑定实例,读者一步一步地学习到Tensorflow有关ID、作用域、类型等方面的知识。以下是译文。 Tensorflow并不是机器学习方面专用的库,而是一个使用图来表示计算
    发表于 09-28 17:42 ?0次下载
    以<b class='flag-5'>Go</b>绑定实例理解TensorFlow

    Python 转向 Go语言的9大原因和3大缺点

    转用一门新语言通常是一项大决策,尤其是当你的团队成员中只有一个使用过它时。今年 Stream 团队的主要编程语言从 Python 转向了 Go。本文解释了其背后的九大原因以及如何做好这一转换。
    发表于 06-17 07:40 ?6924次阅读

    GoPython,Erlang的语言对比分析和Go编程示例概述

    本文对GoPython、Erlang做了一些有趣的分析对比,相信大家能从中感受到Go语言的强大和与众不同。
    的头像 发表于 07-21 09:52 ?8055次阅读
    <b class='flag-5'>Go</b>和<b class='flag-5'>Python</b>,Erlang的语言对比分析和<b class='flag-5'>Go</b>编程示例概述

    Go语言其实有很多优良特性,很多时候都可以代替Python

    Go 要想撼动编程界的常青树 Java 二十多年的地位无疑难度颇大。据 HackerRank 数据显示,2018 年,Java 在开发者最受欢迎的编程语言排行榜中仍然排名第 2,Python 排名第 4,Go 排名第 13,
    的头像 发表于 02-13 10:01 ?4977次阅读

    golang的调度模型-GPM 模型的源码结构

    【导读】GMP 模型是 go 语言轻量快速高效的重要调度模型,本文从 GMP 源码出发直观地解析了这一模型。 这篇文章就来看看 golang 的调度模型-GPM 模型的源码结构。
    的头像 发表于 07-06 11:55 ?2528次阅读

    详解剖析Go语言调度模型的设计

    golang的MPG调度模型是保障Go语言效率高的一个重要特性,本文详细介绍了Go语言调度模型的设计。 前言 Please remember that at the end of th
    的头像 发表于 07-26 10:12 ?2414次阅读
    详解剖析<b class='flag-5'>Go</b>语言<b class='flag-5'>调度</b>模型的设计

    go项目怎么docker镜像体积减小

    【导读】go 项目怎么 docker 镜像体积减小?本文做了详细介绍。
    的头像 发表于 06-12 15:07 ?1633次阅读

    go项目怎么docker镜像体积减小

    go 项目怎么 docker 镜像体积减小?本文做了详细介绍。
    的头像 发表于 06-23 10:49 ?1449次阅读

    Go/Rust挑战Java/Python地位

    编程语言方面,Java 和 Python 仍然遥遥领先,并且分别微小增长了 1.7% 和 3.4%;围绕 Go (增长 20%) 和 Rust (增长 22%) 的兴趣则大幅增加。报告称,如果这种
    的头像 发表于 03-06 10:19 ?924次阅读

    Schedule:简单实用的 Python 周期任务调度工具

    如果你想在Linux服务器上周期性地执行某个 Python 脚本,最出名的选择应该是 Crontab 脚本,但是 Crontab 具有以下缺点: ** 1.不方便执行 秒级的任务
    的头像 发表于 10-30 11:18 ?951次阅读

    Crontab:简单实用的Python 周期任务调度工具

    如果你想周期性地执行某个 Python 脚本,最出名的选择应该是 Crontab 脚本,但是 Crontab 具有以下缺点: 1.不方便执行 秒级任务 。 2.当需要执行的定时任务有上百个的时候
    的头像 发表于 11-01 09:40 ?1048次阅读

    Go在单线程计算性能上的优势

    ,将计算和保存的过程保存在本地的redis缓存中,然后使用Celery来调度这些任务。 问题在于,从这些网址中获取数据的步骤,写在Go Worker里是否合适?Go进行网络请求是否比Pytho
    的头像 发表于 11-02 11:16 ?747次阅读
    <b class='flag-5'>Go</b>在单线程计算性能上的优势

    Go语言比Python强多少

    1.都说Go语言性能非常强大,那么到底比Python强多少? 为了比较Go语言和Python语言在单线程性能上的差距,我们可以做一个简单实验,从1亿减到1:
    的头像 发表于 11-02 14:05 ?914次阅读
    <b class='flag-5'>Go</b>语言比<b class='flag-5'>Python</b>强多少