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

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

期望有个轻量级的开源程序,轻松完成这个活……
3672 次点击
所在节点    Python
25 条回复
gray0
2024-07-24 09:21:41 +08:00
何必多 BB 直接上代码

from concurrent.futures import ProcessPoolExecutor
import asyncio

async def integration_process_and_gather():
with ProcessPoolExecutor() as process_pool:
loop = asyncio.get_running_loop()
numbers = [100000000, 1, 100, 10000, 1000000, 1000, 100000]
tasks = [
loop.run_in_executor(process_pool, do_count_number, n) for n in numbers
]
[print(type(task)) for task in tasks]
results = await asyncio.gather(*tasks)
print(f"integration_hello_world {results}")
yh7gdiaYW
2024-07-24 11:33:34 +08:00
简单点就多进程,复杂点就上 ray ,可以分布式计算用得很爽
lttzzlll
2024-07-25 17:38:07 +08:00
你提出的问题,限制你的思路。web 服务要简单,轻量,快速响应。推理服务耗时耗资源。正确的方式应该是 同一个项目(git repo),部署多个进程。经典的做法应该是 一个 web 服务进程,多个 worker 进程,web 服务和 worker 进程之间用队列。以 django/flask 举例:
lttzzlll
2024-07-25 17:53:54 +08:00
@lttzzlll 。。。你面的问题不是“Python asyncio 中怎么执行 cpu 密集型任务?”。 换成其他的 web 框架或语言,就没有这种问题了吗?而是在 web 服务中,如何处理比较耗时/耗资源的任务。这些问题都有很经典很成熟的方案。把这类任务放到 worker 节点上,用队列传递消息,不够就增加 replica 的数量。非常成熟和广泛使用的方案,你的场景也不例外。
cooljiang
2024-08-02 10:49:58 +08:00
CPU 密集型任务建议换个没 GIL 的 Python 解释器,如 PyPy 之类的。
关于 GIL: https://mp.weixin.qq.com/s/lIkcTuCX5htQcteklCFaZw

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

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

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

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

© 2021 V2EX