parallel.futures和POSIX Linux中的异步I / O之间的区别

时间:2018-07-23 19:46:19

标签: python c asynchronous io posix

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

谢谢

1 个答案:

答案 0 :(得分:2)

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

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

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

  

glibc在用户空间中提供了当前的Linux POSIX AIO实现。这有许多限制,最明显的是,维护多个线程来执行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中使用的,那将是一个手动解决方案(因为如上所述,{{1 }}执行任意并行,它不专门支持I / O。

相关问题