【问题标题】:The difference between asynchronous I/O in concurrent.futures and POSIX Linux [closed]concurrent.futures 和 POSIX Linux 中的异步 I/O 之间的区别 [关闭]
【发布时间】:2018-12-31 08:16:36
【问题描述】:

说到异步I/O,我想了解Linux中使用的POSIX接口和Python中使用的concurrent.futures接口之间的区别。当我想在C 代码中实现异步I/O 时,我使用前一种,而在python 代码中使用后一种。我知道python中的concurrent.futures是一种基于线程的技术,它将回调附加到线程,以便稍后可以轮询它的状态。但是,我不知道 POSIX 是如何工作的!它也是基于线程的吗?

谢谢

【问题讨论】:

  • concurrent.futures 还包括一个ProcessPoolExecutor,它将在其他进程中执行任务
  • concurrent.futures 根本不是关于 I/O 的,所以我们在这里完全是苹果和橘子。

标签: python c asynchronous io posix


【解决方案1】:

concurrent.futures 不是专门基于线程的(有可用的基于线程和进程的执行器),也不是专门针对异步 I/O;这是一般的并行性。您可以用它来并行化 I/O,但它是异步的工作任务,I/O 是可以并行化的特定事物。

碰巧,对于 I/O,您会想要使用ThreadPoolExecutor; CPython's GIL 对于 I/O 绑定任务来说不是问题,从 ProcessPoolExecutor 的工作进程返回结果所需的 IPC 将在很大程度上消除并行化 I/O 的好处。我只是想明确一点,concurrent.futures 不仅仅与线程有关。

POSIX AIO 至少在 Linux 上只是一个包装线程的用户空间库(大致相当于使用 concurrent.futures.ThreadPoolExecutor 执行 I/O 任务),根据 the NOTES in the man page you linked

当前 Linux POSIX AIO 实现由 glibc 在用户空间提供。这有许多限制,最明显的是维护多个线程来执行 I/O 操作很昂贵并且扩展性很差。在基于内核状态机的异步 I/O 实现方面的工作已经进行了一段时间(参见 io_submit(2)、io_setup(2)、io_cancel(2)、io_destroy(2)、io_getevents(2)),但是这个实现还没有成熟到可以使用内核系统调用完全重新实现 POSIX AIO 实现的程度。

重点在于,在这两种情况下,它基本上是关于在后台线程中调度 I/O 请求,并使用某种句柄来允许轮询和检索结果。

内核支持的异步 I/O 可以通过以下任何方式避免或限制线程:

  1. 在内部管理 I/O 请求队列,也许只是串行调度它们,与磁盘驱动程序一起对请求进行排序,以便磁头在它们之间寻找并有效地拉动它们
  2. 并行调度,并响应设备中断以发出完成信号
  3. 使用共享线程池(类似于用户空间,但开销较低,因为整个操作系统可以共享池)

但是这些技术都没有真正用于 Linux 的 POSIX AIO 实现,如果其中任何一个通过concurrent.futures 在 Python 中使用,这将是一个手动解决方案(因为如上所述,concurrent.futures 执行任意并行性,它并不专门支持 I/O)。

【讨论】:

  • 写得很好。谢谢你的澄清
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多