在谈到异步I / O时,我想了解Linux中使用的POSIX接口和Python中使用的concurrent.futures接口之间的区别。当我想在C
代码中实现异步I / O时,使用前者,而在python
代码中实现后一个。我了解python中的concurrent.futures
是一种基于线程的技术,它将回调函数附加到线程上,以便以后可以对其状态进行轮询。但是,我不知道POSIX的工作原理!也是基于线程的吗?
谢谢
答案 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可以通过以下任何一种方式避免或限制线程:
,但是这些技术实际上都没有在Linux的POSIX AIO实现中使用,并且如果其中任何一项是通过concurrent.futures
在Python中使用的,那将是一个手动解决方案(因为如上所述,{{1 }}执行任意并行,它不专门支持I / O。