在谈到异步I/O时,我想了解在Linux中使用的POSIX接口和concurrent.futures中使用的concurrent.futures接口之间的区别。当我想在C代码中实现异步I/O时,使用前者,在python代码中使用后者。据我所知,python中的concurrent.futures是一种基于线程的技术,它将回调附加到线程,以便稍后可以对其状态进行轮询。但是,我不知道POSIX是如何工作的!它也是基于线程的吗?
谢谢
发布于 2018-07-23 19:53:03
concurrent.futures不是专门基于线程的(有可用的基于线程和基于进程的执行器),也不是专门针对异步I/O的;它是通用的并行性。您可以使用它并行I/O,但是它是异步的工作任务,I/O是可以并行化的特定事物。
碰巧的是,对于I/O,您可能希望使用ThreadPoolExecutor;对于I/O绑定的任务来说,CPython's GIL不是问题,返回ProcessPoolExecutor的工作进程的结果所需的IPC将在很大程度上消除并行I/O的好处。我只是想清楚,concurrent.futures不仅仅是关于线程的。
POSIX (至少在Linux上)只是一个用户空间库,包装线程(大致相当于使用concurrent.futures.ThreadPoolExecutor执行I/O任务)。
当前的Linux实现是由glibc在用户空间中提供的。这有许多限制,最值得注意的是,维护多个线程来执行I/O操作是昂贵的,而且扩展性很差。基于内核状态机的异步I/O实现工作已经进行了一段时间(请参阅io_submit(2)、io_setup(2)、io_cancel(2)、io_destroy(2)、io_getevents(2)),但该实现尚未成熟到可以使用内核系统调用完全重新实现POSIX实现的程度。
重点是,在这两种情况下,从根本上讲,它都是在后台线程中分配I/O请求,其中包含某种句柄,以允许轮询和检索结果。
内核支持的异步I/O可以通过以下任何一种方法来避免或限制线程:
但是,这些技术都没有实际用于Linux的POSIX实现中,如果其中任何一种技术是通过concurrent.futures在Python中使用的,那么它将是一个手动的解决方案(因为如前所述,concurrent.futures执行任意并行性,它不具体支持I/O)。
https://stackoverflow.com/questions/51486233
复制相似问题