aiofiles 这个库意义何在?

2017 年 2 月 26 日
 xiusedelang
https://github.com/Tinche/aiofiles
今天蛋疼的看了一眼,发现它把文件操作扔到 asnycio 里面,但是文件的读写模式仍然是 block 的。搞不懂这么干到底有什么意义。我是 python 小白,还请指教一下。
6828 次点击
所在节点    Python
8 条回复
neoblackcap
2017 年 2 月 26 日
不就是封装一个线程池吗?这个不会堵塞主线程,就是这样
xiusedelang
2017 年 2 月 26 日
@neoblackcap ,对 asyncio 不太了解,我猜测它是用了一个单独线程执行所有协程工作。这样有大量文件 IO 时应该并没有带来多大好处,不过是把阻塞放到另一个线程了。我觉得这个库应该使用 epoll 类的异步 API ,才能完全发挥 asyncio 的优势,但是看看代码好像并没有。
neoblackcap
2017 年 2 月 27 日
@xiusedelang epoll 不支持本地 IO,非堵塞只是指不堵塞主线程,除非 Windows ,要不然你要完全用户态线程不堵塞是做不到的,那需要的是异步 IO 接口,内核不支持都没有用
ryd994
2017 年 2 月 27 日
@neoblackcap POSIX 不是有 aio 么
@xiusedelang 用的是 coroutine 。但是不会阻塞啊。非阻塞的方法有很多, select poll aio 都行
xiusedelang
2017 年 2 月 27 日
@neoblackcap epoll 在这里确实不适合,见笑了
@ryd994 coroutine 里面调用系统的阻塞 API ,还是要阻塞的吧。我觉得这个库应该用你说的这几个非阻塞 API ,但翻了半天代码它的确是用的最普通的阻塞方法。
tinyproxy
2017 年 2 月 27 日
你到 stackoverflow 搜搜文件异步 io 的实现方式,线程池是比较简单方便而且平台兼容性比较好的做法。
fengjianxinghun
2017 年 2 月 27 日
@ryd994 现在的 aio 都是线程实现的。。。
kuroismith
2017 年 2 月 27 日
感觉没什么意义, 之前测试了一下, 读 100 个文件, aiofiles 比普通的方式还要更慢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/343355

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX