Python asyncio 中的自定义非阻塞操作
Custom non-blocking operations in Python asyncio
目前,asyncio Event Loop supports non-blocking work with network sockets, files, subprocesses, and signals. For other operations, documentations describes executing code in thread or process pools,但这似乎效率低得多(线程与协程)。
有没有办法引入额外的低级非阻塞操作,例如包装 I/O-heavy 库调用?必须实现哪些原语?
与大多数事件循环一样,asyncio 事件循环是围绕轮询 IO 源、Unix 上的文件描述符和 Windows 上的文件句柄构建的。 Poll 或 select 是一种有效监视多个文件描述符的 IO 操作,挂起当前线程直到发生有趣的事情,例如新数据到达。可选地,轮询接受超时,因此即使没有新的 IO 事件也可以继续执行。有关该主题的更详细处理,请参阅 this SO answer 和同一问题的其他答案。
基于轮询的设计允许 asyncio 原生支持两种事件:
- IO 可能
- 超时已过
所有其他类型的事件都必须用这两个来表示。例如,call_soon_threadsafe
wakes up the event loop by writing into an internal pipe monitored by the event loop. The implementation of run_in_executor
使用call_soon_threadsafe
通知asyncio同步功能已经完成。
要将完全不同的轮询机制连接到 asyncio,通常会生成一个专用于这种轮询的线程,并使用 call_soon_threadsafe
通知 asyncio 新事件。例如, 展示了如何将原始多处理池(可以终止)连接到 asyncio。
目前,asyncio Event Loop supports non-blocking work with network sockets, files, subprocesses, and signals. For other operations, documentations describes executing code in thread or process pools,但这似乎效率低得多(线程与协程)。
有没有办法引入额外的低级非阻塞操作,例如包装 I/O-heavy 库调用?必须实现哪些原语?
与大多数事件循环一样,asyncio 事件循环是围绕轮询 IO 源、Unix 上的文件描述符和 Windows 上的文件句柄构建的。 Poll 或 select 是一种有效监视多个文件描述符的 IO 操作,挂起当前线程直到发生有趣的事情,例如新数据到达。可选地,轮询接受超时,因此即使没有新的 IO 事件也可以继续执行。有关该主题的更详细处理,请参阅 this SO answer 和同一问题的其他答案。
基于轮询的设计允许 asyncio 原生支持两种事件:
- IO 可能
- 超时已过
所有其他类型的事件都必须用这两个来表示。例如,call_soon_threadsafe
wakes up the event loop by writing into an internal pipe monitored by the event loop. The implementation of run_in_executor
使用call_soon_threadsafe
通知asyncio同步功能已经完成。
要将完全不同的轮询机制连接到 asyncio,通常会生成一个专用于这种轮询的线程,并使用 call_soon_threadsafe
通知 asyncio 新事件。例如,