V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
song135711
V2EX  ›  Python

请教下, 用 Python 调用 goroutine 实现的线程池, 做一些 http 请求可行吗

  •  
  •   song135711 ·
    Song2017 · 2021-07-01 12:00:07 +08:00 · 2378 次点击
    这是一个创建于 1023 天前的主题,其中的信息可能已经有所发展或是发生改变。
    第 1 条附言  ·  2021-07-02 13:57:21 +08:00
    不好意思各位, 下面是修正和补充
    1. 标题: 线程池太偏 Python 了, 任务池或协程更准确些
    2. 背景: 程序运行在函数计算服务器, 大致原理是在一个函数里完成一系列的 http 请求, http 请求有先后次序, 同时函数是独立运行的.
    asyncio 使用 eventloop 线程不能分别执行函数, golang 的 GPM 模型在高并发的情况下效率更高
    3. 思路: py 里调用 go 编写的类包. py 负责业务逻辑, go 类包实现 http 调用.
    py 函数里会记录每个 http 请求的状态, goroutine 来执行每个 http 请求.
    4. 问题: goroutine 会不会跟 Cpython 冲突, 造成线程安全等问题
    27 条回复    2021-07-02 16:22:17 +08:00
    wellsc
        1
    wellsc  
       2021-07-01 12:12:26 +08:00 via iPhone
    出了 http 还有别的方式吗
    pabupa
        2
    pabupa  
       2021-07-01 12:44:22 +08:00
    emmm……试试共享内存,功能肯定可以做到
    CEBBCAT
        3
    CEBBCAT  
       2021-07-01 12:50:49 +08:00 via Android
    是不是就我一人儿没听懂?线程池一般不都是进程内部的吗?进程内部应该就是一个二进制吧,那还怎么跨语言调用呢? ddl/so ?

    可以讲讲为什么这样设计吗?
    song135711
        4
    song135711  
    OP
       2021-07-01 13:04:04 +08:00
    @wellsc 都是 io 密集型的任务
    no1xsyzy
        5
    no1xsyzy  
       2021-07-01 13:12:46 +08:00   ❤️ 1
    为什么要用次线程调度形式实现线程池?
    为什么要从 Python 调用 golang 跨语言?

    为什么不用 asyncio 呢?
    Jwyt
        6
    Jwyt  
       2021-07-01 13:19:46 +08:00
    @song135711 io 密集型的,和语言速度关系不大。就像 5 楼说的直接 python 请求就好了
    wellsc
        7
    wellsc  
       2021-07-01 13:19:56 +08:00
    @song135711 跟 io 密集型有啥关系?跨语言调用除了 http 还有别的更优解吗
    youngce
        8
    youngce  
       2021-07-01 13:53:37 +08:00
    槽点有点多,“goroutine 实现的线程池“ 不应该是协程池吗?

    话说回来,假如你用 python 去调 golang,中间走 http 协议,怎么说也要花费个 20ms,python 的 CPU 性能再怎么拉胯也比多一次网络 IO 强吧
    est
        9
    est  
       2021-07-01 13:56:28 +08:00
    goroutine 是 golang 专有的吧。py 怎么个调法?
    LeeReamond
        10
    LeeReamond  
       2021-07-01 14:07:24 +08:00
    @wellsc 老哥你回了两层了还没搞清楚状况吗...老哥在哪里高就?
    wellsc
        11
    wellsc  
       2021-07-01 14:08:45 +08:00
    @LeeReamond 来,键盘给你,你来说说你怎么理解的。楼主 Python 想要调用 golang 的 goroutine 用 Http 有什么问题?
    Jwyt
        12
    Jwyt  
       2021-07-01 17:09:03 +08:00
    @wellsc 因为本质就是做一些 http 请求,直接用 python 请求就好了,何必用 python 调 golang
    wellsc
        13
    wellsc  
       2021-07-01 17:11:54 +08:00
    @Jwyt 楼主也没说背景啊,就说了需求,顺着楼主的思路解决有问题吗,不然还要去猜背景?
    learningman
        14
    learningman  
       2021-07-01 17:18:34 +08:00 via Android
    @wellsc 因为见过太多 XYZ 问题了
    wellsc
        15
    wellsc  
       2021-07-01 17:23:59 +08:00
    @learningman 所以说你知道 x 问题是啥吗?
    Jwyt
        16
    Jwyt  
       2021-07-01 17:42:34 +08:00
    @wellsc 做 http 请求能有啥背景?顺着楼主的思路解决,楼主的思路就是多此一举呀
    Vegetable
        17
    Vegetable  
       2021-07-01 17:47:43 +08:00
    从中午到现在,这个帖子我一直在关注,可惜到现在也没搞清楚楼主想干啥

    你是想通过.so 在 py 里使用 go 编写的代码?还是想在 python 通过 http 调用 go 实现 RPC ?
    Trim21
        18
    Trim21  
       2021-07-01 17:51:28 +08:00 via Android
    我来猜测一下,楼主是不是要用一段 golang 代码来处理请求,但是又不会写 golang ?
    dreampuf
        19
    dreampuf  
       2021-07-01 17:56:56 +08:00
    可行,问题是从哪里开始,由 Golang serve HTTP listen 还是 Python?
    如果是前者可以考虑 Python embedded Golang 的实现,参考 https://github.com/a-tal/httpy
    如果是后者,可以在标准的 Python Webservice 之后将 request/response 的 fd 转给 golang 参考 https://github.com/vladimirvivien/go-cshared-examples

    但是无论如何,就你提到的都是 IO 密集型任务,最终都会被转嫁成为 IO 更密集型任务。
    你这个问题背后可能是对于 GIL 的不满,或者是觉得 Complied language 的灵活度的抱怨。这些都可以拆分成更细的领域去解决。当然直接混合两个运行时环境除了 ROI 不高,也没有什么问题。
    keepeye
        20
    keepeye  
       2021-07-01 18:04:50 +08:00
    你这应该用 grpc 或者 mq 实现
    Deeymmm
        21
    Deeymmm  
       2021-07-01 23:43:22 +08:00   ❤️ 1
    先学语文再学代码
    song135711
        22
    song135711  
    OP
       2021-07-02 13:59:35 +08:00
    @no1xsyzy golang 写业务代码有点慢, 另外这边开发以 python 为主
    song135711
        23
    song135711  
    OP
       2021-07-02 14:09:29 +08:00
    @dreampuf 谢谢大牛, 能麻烦再给说下 ROI 全称是什么吗, 搜到一些经济学的名词
    song135711
        24
    song135711  
    OP
       2021-07-02 14:12:01 +08:00
    @Vegetable py 里使用 golang
    song135711
        25
    song135711  
    OP
       2021-07-02 14:17:44 +08:00
    @Trim21 本质上是 golang 代码来处理 python 里的请求, 写过一些 golang 代码, 不过跨运行时调用心里没底, 想看下有哪些坑
    dreampuf
        26
    dreampuf  
       2021-07-02 16:09:05 +08:00
    @song135711 就是你搜到的,因为资源往往不是无限的,所有的方案都会考虑一个实际投入产出比。
    song135711
        27
    song135711  
    OP
       2021-07-02 16:22:17 +08:00
    谢谢, 学习了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5233 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 07:11 · PVG 15:11 · LAX 00:11 · JFK 03:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.