【问题标题】:Does asyncio supports asynchronous I/O for file operations?asyncio 是否支持文件操作的异步 I/O?
【发布时间】:2016-04-14 11:42:23
【问题描述】:

asyncio 是否支持文件操作的异步 I/O?如果是,我如何在 Python 3.5 中使用 async/await 语法代码?

【问题讨论】:

  • 我的意思是,我需要非阻塞文件 I/O 功能。但在文档中我发现只有描述符监控功能。
  • 如果你只想要非阻塞 IO,你应该能够使用 python 的线程。你想要异步 IO 还是非阻塞 IO? stackoverflow.com/questions/319132/… 可能有一些有用的信息。
  • 我们来解释一下。我的 IOLoop 中有几个使用套接字的任务。我想再添加一个任务,它将读取要从文件发送的数据。同步将由 asyncio.Queue 执行。

标签: python python-3.x python-asyncio python-3.5


【解决方案1】:

大多数操作系统不支持异步文件操作。 这就是asyncio 也不支持它们的原因。

更多解释请见the asyncio wiki

【讨论】:

  • 是的。甚至 node.js 在内部使用线程池来提供异步文件 API
  • 他们模仿它,它会有所作为。
  • 内部使用线程池,不是协同切换。不过性能还是不错的。
  • @AntonLahti Windows 与大多数其他操作系统“大相径庭”。你能说出其他支持这一点的人吗?请注意答案状态大多数不支持它。
  • 不知道有没有比 6 多年前的信息更新的信息(文章字面意思是“最近关于 Linux 内核的讨论:非阻塞缓冲文件读取操作(2014 年 9 月) )." 作为最后一个参考点)。我非常怀疑那段时间没有任何变化。
【解决方案2】:

这取决于您使用的库。

古玩

curio 提供此功能,请参阅https://curio.readthedocs.io/en/latest/reference.html#module-curio.file

异步

2021 年更新:aiofile ~2~3(当前)通过 https://github.com/mosquito/caioLinux >= 4.18 上支持真正的异步 IO,否则回退到线程实现。

Plain asyncio 没有,尽管有 3rd 方库,例如aiofiles(同步文件访问被隔离在线程中)和aiofile(注意拼写)(同步文件访问在上述段落之外的其他情况下在线程中)

现代操作系统确实提供了异步文件原语,但它们各不相同,因此每个都需要自己的实现。请比较:

我怀疑有人会很快从 node.js 中删除底层异步 io 并制作一个像样的 Python 库,或者也许有人已经有了。

专门针对 Linux,https://pypi.org/project/liburing/ 中有低级绑定

如需全面了解大约 2020 年 Linux 中的异步 IO API,请参阅https://www.scylladb.com/2020/05/05/how-io_uring-and-ebpf-will-revolutionize-programming-in-linux/

【讨论】:

  • 据我所知,您提到的所有选项都使用线程(curio、aiofiles、glib 的 aio 实现,甚至 Windows Overlapped I/O 在后台使用线程池)。跨度>
  • 有推荐的吗?官方 python asyncio 文档建议的 aiofiles?
  • 对于curio,规范推荐为curio.fileasyncio 似乎没有推荐,所以选择流行的,比如 aiofiles
  • 显然,aiofile(不是aiofiles!)支持Linux libaio asynchronous file operations since version 2.0
  • 干杯,@MisterMiyagi 我已经更新了答案。
【解决方案3】:

asyncio 不支持此功能。但是,aiofiles 仅支持这一点。请看一下。

【讨论】:

    【解决方案4】:

    根据 Python 3.9,这可以通过 asyncio 来实现。 https://docs.python.org/3.9/library/asyncio-task.html#asyncio.to_thread

    await asyncio.to_thread(shutil.copyfile, "a", "b")
    

    【讨论】:

      猜你喜欢
      • 2012-07-05
      • 1970-01-01
      • 2011-10-27
      • 1970-01-01
      • 1970-01-01
      • 2011-11-14
      • 2017-03-26
      • 2016-07-29
      相关资源
      最近更新 更多