asyncio 是不是支持文件操作的异步 I/O?
Posted
技术标签:
【中文标题】asyncio 是不是支持文件操作的异步 I/O?【英文标题】: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? ***.com/questions/319132/… 可能有一些有用的信息。 我们来解释一下。我的 IOLoop 中有几个使用套接字的任务。我想再添加一个任务,它将读取要从文件发送的数据。同步将由 asyncio.Queue 执行。 【参考方案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/caio 在 Linux >= 4.18
上支持真正的异步 IO,否则回退到线程实现。
Plain asyncio
没有,尽管有 3rd 方库,例如aiofiles
(同步文件访问被隔离在线程中)和aiofile
(注意拼写)(同步文件访问在上述段落之外的其他情况下在线程中)
现代操作系统确实提供了异步文件原语,但它们各不相同,因此每个都需要自己的实现。请比较:
http://man7.org/linux/man-pages/man7/aio.7.html https://msdn.microsoft.com/en-us/library/windows/desktop/aa365683(v=vs.85).aspx https://developer.apple.com/library/content/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/TechniquesforReadingandWritingCustomFiles/TechniquesforReadingandWritingCustomFiles.html我怀疑有人会很快从 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.file
; asyncio
似乎没有推荐,所以选择流行的,比如 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")
【讨论】:
以上是关于asyncio 是不是支持文件操作的异步 I/O?的主要内容,如果未能解决你的问题,请参考以下文章
python asyncio 异步 I/O - 实现并发http请求(asyncio + aiohttp)