当前,asyncio Event Loop支持使用网络套接字,文件,子进程和信号的非阻塞工作。对于其他操作,文档描述了executing code in thread or process pools,但效率似乎低得多(线程与协程)。
有没有办法引入其他低级别非阻塞操作,例如包装大量I / O的库调用?必须实现哪些原语?
答案 0 :(得分:1)
与大多数事件循环一样,异步事件循环围绕轮询IO源,Unix上的文件描述符和Windows上的文件句柄而构建。 Poll 或 select 是一项IO操作,可以有效地监视多个文件描述符,将当前线程挂起,直到发生有趣的事情,例如新数据到来。 (可选)轮询可以接受超时,因此即使没有新的IO事件,执行也可以继续。有关该主题的更详细处理,请参考this SO answer和相同问题的其他答案。
基于民意测验的设计允许asyncio本机支持两种事件:
所有其他类型的事件必须以这两种形式表示。例如,call_soon_threadsafe
通过写入受事件循环监视的内部管道来唤醒事件循环。 run_in_executor
的实现使用call_soon_threadsafe
通知asyncio同步功能已完成。
要将完全不同的轮询机制连接到asyncio,通常会产生一个专用于这种轮询的线程,并使用call_soon_threadsafe
通知asyncio新事件。 This answer例如,显示了如何将原始的多处理池(可以终止)连接到asyncio。