asyncio是否支持文件操作的异步I/O?

Cth*_*zzz 29 python python-3.x python-asyncio python-3.5

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

And*_*lov 19

大多数操作系统不支持异步文件操作.这就是为什么asyncio不支持他们.

有关进一步说明,请参阅asyncio wiki.

  • 他们*模仿*它,这有所作为。 (2认同)
  • 它内部使用线程池,而不是协作切换。不过性能还是相当不错的。 (2认同)
  • 这是极其错误的。Windows 通过 OVERLAPPED 标志支持异步文件 I/O(打开文件除外)。libuv 使用这个。 (2认同)
  • 现在不再正确了,因为 Linux 有 `io_uring` 而 Windows 总是有异步文件 io. (2认同)

Dim*_*nek 11

这取决于您使用的库.

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

plain asyncio没有,但是有第三方库,例如https://github.com/Tinche/aiofiles(这是在线程中隔离的真正同步文件访问)

现代操作系统确实提供了异步文件原语,但这些原语是多种多样的,因此每个都需要自己的实现.请比较:

我怀疑有人会很快从基础异步io中删除node.js并创建一个不错的Python库,或者也许已经有人.

  • 据我所知,你提到的所有选项都使用线程(curio,aiofiles,glib的aio实现,甚至Windows Overlapped I/O都使用了一个线程池). (4认同)
  • 显然,``aiofile``(不是``aiofiles``!)支持[Linux libaio 异步文件操作自版本 2.0](https://pypi.org/project/aiofile/)。 (2认同)

Z. *_*Qui 8

asyncio不支持这个.但是, aiofiles支持这一点.请看一看.


Swe*_*gin 5

根据 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")
Run Code Online (Sandbox Code Playgroud)

  • 这是在单独线程中执行的阻塞调用。本身不是异步/等待 (2认同)