【问题标题】:Custom non-blocking operations in Python asyncioPython asyncio 中的自定义非阻塞操作
【发布时间】:2019-04-01 16:11:24
【问题描述】:

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

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

【问题讨论】:

  • 你能举一个你想介绍的低级调用的例子吗?底层调用本身是异步的吗?如果是这样,它是否提供通知机制,或者调用者是否希望轮询它以完成?
  • 不,底层库调用被阻塞。我正在考虑引入非阻塞接口扩展,因此它与 asyncio 兼容。为了明确起见,我们将Windows Overlapped Serial port communication 视为非阻塞接口的示例。
  • 如果底层库阻塞并且你想包装它(而不是重新实现它),那么线程可能是你唯一的选择。
  • 我可以控制库代码,因此我可以使用非阻塞调用扩展接口。但我完全想念asyncio 期望的电话。

标签: python-asyncio nonblocking


【解决方案1】:

与大多数事件循环一样,异步事件循环是围绕轮询 IO 源、Unix 上的文件描述符和 Windows 上的文件句柄构建的。 Pollselect 是一种 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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-24
    • 1970-01-01
    • 2020-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多