请教下, 用 Python 调用 goroutine 实现的线程池, 做一些 http 请求可行吗 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard ay
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 3188 次点击
    这是一个创建于 1588 天前的主题,其中的信息可能已经有所发展或是发生改变。
    第 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
    /div>
    是不是就我一人儿没听懂?线程池一般不都是进程内部的吗?进程内部应该就是一个二进制吧,那还怎么跨语言调用呢? 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 呢?
    Dockerfile
        6
    Dockerfile  
       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 有什么问题?
    Dockerfile
        12
    Dockerfile  
       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 问题是啥吗?
    Dockerfile
        16
    Dockerfile  
       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     Solana     933 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 21:15 PVG 05:15 LAX 13:15 JFK 16:15
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86