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

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

期望有个轻量级的开源程序,轻松完成这个活……
2837 次点击
所在节点    Python
25 条回复
gray0
107 天前
何必多 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
107 天前
简单点就多进程,复杂点就上 ray ,可以分布式计算用得很爽
lttzzlll
106 天前
你提出的问题,限制你的思路。web 服务要简单,轻量,快速响应。推理服务耗时耗资源。正确的方式应该是 同一个项目(git repo),部署多个进程。经典的做法应该是 一个 web 服务进程,多个 worker 进程,web 服务和 worker 进程之间用队列。以 django/flask 举例:
lttzzlll
106 天前
@lttzzlll 。。。你面的问题不是“Python asyncio 中怎么执行 cpu 密集型任务?”。 换成其他的 web 框架或语言,就没有这种问题了吗?而是在 web 服务中,如何处理比较耗时/耗资源的任务。这些问题都有很经典很成熟的方案。把这类任务放到 worker 节点上,用队列传递消息,不够就增加 replica 的数量。非常成熟和广泛使用的方案,你的场景也不例外。
cooljiang
98 天前
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