首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >concurrent.futures和POSIX中异步I/O的区别

问concurrent.futures和POSIX中异步I/O的区别
EN

Stack Overflow用户
提问于 2018-07-23 19:46:19
回答 1查看 217关注 0票数 0

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

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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可以通过以下任何一种方法来避免或限制线程:

  1. 在内部管理I/O请求队列,可能只是串行地分配它们,与磁盘驱动程序一起工作,以命令请求,这样头部就可以跨它们寻找并有效地提取它们。
  2. 并行调度,并响应设备中断以完成信号。
  3. 使用共享线程池(类似于用户空间,但开销较低,因为整个操作系统可以共享该池)

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51486233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档