Python asyncio中的自定义非阻塞操作

目前,asyncio Event Loop支持使用网络套接字,文件,子进程和信号进行非阻塞工作 . 对于其他操作,文档描述executing code in thread or process pools,但这似乎效率低得多(线程与协同程序) .

有没有办法引入额外的低级非阻塞操作,例如包装I / O大量的库调用?必须实现哪些原语?

回答(1)

3 years ago

与大多数事件循环一样,asyncio事件循环是围绕轮询IO源,Unix上的文件描述符和Windows上的文件句柄构建的 . 轮询或选择是一种IO操作,它有效地监视多个文件描述符,暂停当前线程直到发生有趣的事情,例如,新数据到来了 . 可选地,轮询接受超时,因此即使没有新的IO事件,执行也可以继续 . 有关该主题的更详细的处理,请参阅this SO answer和同一问题的其他答案 .

基于轮询的设计允许asyncio本机支持两种事件:

  • IO可能

  • 超时已过期

所有其他类型的事件必须以这两种方式表达 . 例如,call_soon_threadsafe通过写入事件循环监视的内部管道来唤醒事件循环 . run_in_executor的实现使用 call_soon_threadsafe 通知asyncio同步函数已完成 .

要将完全不同的轮询机制连接到asyncio,通常会生成专用于该类轮询的线程,并使用 call_soon_threadsafe 来通知新事件的asyncio . 例如,This answer显示了如何将原始多处理池(可以终止)连接到asyncio .