Skip to main content
 首页 » 编程设计

python之异步/IO 和并行

2025年05月04日13jpfss

我正在使用 aiohttp 创建一个 Async/IO 网络服务器。但是,据我了解,Async/IO 意味着服务器只能在一个处理核心上运行。另一方面,uwsgi 等常规同步服务器可以通过真正的并行线程和进程充分利用计算机的计算资源。那么,如果 Async/IO 比多处理更少并行,为什么它是新的和流行的? aiohttp 这样的异步服务器可以进行多进程处理吗?

请您参考如下方法:

Why, then, is Async/IO new and trendy if it less parallel than multiprocessing?

两者解决不同的问题。 Asyncio 允许编写没有“回调 hell ”的异步代码。 await 允许使用循环、ifs、try/except 等结构,并在 await 点自动切换任务。这可以为大量连接提供服务,而无需为每个连接生成一个线程,但具有可维护的代码,看起来就像是为阻塞连接而编写的。因此,asyncio 主要帮助解决唯一瓶颈是等待外部事件(例如网络 IO 和超时)的代码。

另一方面,多处理是关于并行执行CPU 绑定(bind) 代码,例如科学计算。由于 the GIL,操作系统线程无济于事, multiprocessing 产生独立的操作系统进程并在它们之间分配工作。这是以进程无法轻松共享数据为代价的——所有通信都是通过管道序列化或使用专用 proxies 完成的。 .

多线程异步式框架在理论上是可能的——例如,Rust 的 tokio就像那样 - 但由于 Python 的 GIL 阻止使用多个内核,因此不太可能带来性能优势。结合 asyncio 和 multiprocessing 可以处理不依赖于共享状态的 asyncio 代码,asyncio 通过 run_in_executor 支持共享状态。和 ProcessPoolExecutor .