正如几乎每个人在第一次看到 Python 中的线程时都知道的那样,GIL 让真正想要并行处理的人的生活变得悲惨——或者至少给它一个机会。
我目前正在考虑实施类似 Reactor 模式的东西。实际上,我想在类似线程的情况下侦听传入的套接字连接,当有人尝试连接时,接受该连接并将其传递给类似线程的另一个线程进行处理。
我(还)不确定我可能面临什么样的负载。我知道目前对传入消息设置了 2MB 的上限。从理论上讲,我们每秒可以获得数千次(尽管我不知道实际上我们是否见过这样的事情)。处理一条消息所花费的时间并不是 特别 重要,但显然越快越好。
我正在研究 Reactor 模式,并使用 multiprocessing
库开发了一个小示例(至少在测试中)似乎工作得很好。但是,现在/很快我们就会有可用的 asyncio 库,它将为我处理事件循环。
结合 asyncio
和 multiprocessing
有什么可以咬我的吗?
原文由 Wayne Werner 发布,翻译遵循 CC BY-SA 4.0 许可协议
您应该能够安全地组合
asyncio
和multiprocessing
而不会遇到太多麻烦,尽管您不应该直接使用multiprocessing
。asyncio
(以及任何其他基于事件循环的异步框架)的主要错误是阻塞事件循环。如果您尝试直接使用multiprocessing
,任何时候您阻塞等待子进程,您都会阻塞事件循环。显然,这是不好的。避免这种情况的最简单方法是使用
BaseEventLoop.run_in_executor
concurrent.futures.ProcessPoolExecutor
执行函数。ProcessPoolExecutor
是使用multiprocessing.Process
实现的进程池,但是asyncio
内置支持在其中执行函数而不阻塞事件循环。这是一个简单的例子:对于大多数情况,仅此功能就足够了。 If you find yourself needing other constructs from
multiprocessing
, likeQueue
,Event
,Manager
, etc., there is a third-party名为aioprocessing
库(完全公开:我写了它),它提供了asyncio
所有multiprocessing
数据结构的兼容版本。这是一个演示的示例: