Python asyncio 中怎么执行 cpu 密集型任务?

55 天前
 gosky
理论上讲,两个办法:
一、多线程,但不知道怎么全局解释锁被优化得怎么样
二、多进程,消耗更多内存,因为需要加载模型,内存复制必须要考虑。多进程管理是个麻烦,启动耗时也得考虑

期望有个轻量级的开源程序,轻松完成这个活……
2700 次点击
所在节点    Python
25 条回复
changz
55 天前
多线程+c/c++ ffi
gaogang
55 天前
cpu 密集的任务 用其他合适的语言实现
然后通过 rpc 暴露出来 正好给 python 的 asyncio 调
lambdaq
55 天前
asyncio 顾名思义是 异步 io 。。。众所周知,py 要么卡 cpu 要么卡 io ,asyncio 只解决卡 io 的问题啊。
fuis
55 天前
ysn2233
55 天前
用 c/c++/rust 的 ffi 做 binding 吧,实在不行 java/go 什么的也行,python 就做个前端调一下
mirrornighth
55 天前
多进程
ipwx
55 天前
“因为需要加载模型,内存复制必须要考虑。”

你是啥模型。有些模型开多线程是可以并行的。
Goooooos
55 天前
python 3.13 可以加个参数去掉 GIL
guochao
55 天前
针对锁和 python 效率的问题:
- 如果你的计算任务可以用 c/rust 的模块,最好是在 c/rust 的部分处理,最好能批处理
- 如果是 pure python ,也许可以试试 taichi 或者类似的东西。因为 python 可以被再次编译成 native 或者 gpu kernel ,并针对架构优化
针对 asyncio 只管异步切换,计算存在长时间阻塞的问题
- (不同进程、单独服务的方案)要么 celery ,或者自己搓一个简单的队列
- (简单在同一个进程中的方案)要么 thread pool executor
itskingname
55 天前
chenqh
55 天前
你加载的模型很大吗?不然想不出来为什么不用多进程
ruanimal
55 天前
跑模型还是多进程好
razertory
55 天前
asyncio 是做 IO 密集任务的,不是做 CPU 密集任务
scipelaina
55 天前
`asyncio.to_thread`; `concurrent.futures`.
日经问题,Mark as Duplicated.
wujian752
55 天前
如果是神经网络模型现在 onnxruntime 在 inference 的时候可以不受 GIL 影响
crackidz
55 天前
Python 主要冷启动耗时几十 ms 左右,剩下的交到你的代码中了,启动时间主要取决于你的代码吧...

上面说的基本差不多了,但现在不推荐用那个 nogil 版本,要改你的代码支持部分功能,第三方库也未见得支持。另外还有一些隐蔽 bug...
yoiteshaw
55 天前
我工作中遇到过类似的事情,两年前,无论怎么优化都收效甚微,多线程因为 GIL 反而更慢,最后不得已用多进程去做,用 socket 去通信。
今年我推翻用 rust 重写了,一些逻辑直接的遍历,简简单单 pair_iter 解决,心情舒畅。
sagaxu
55 天前
Python 的 CPU 密集型库大都用 C 实现,大部分时间不会持有 GIL
skuuhui
54 天前
最简单是写个 c++模块,用 python 去调。
其他方法有
1. 换个没锁的解释器
2. wasm
3. https://numba.pydata.org/https://www.trypyjion.com/
Nich0la5
54 天前
asyncio 就不是给你做 cpu 密集型用的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1059409

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX