有没有一种简单的方法在Python中异步写入文件?
我知道Python自带的文件IO是阻塞式的,在大多数情况下这是可以接受的。但对于特定情况,我需要尽可能地减少写入对应用程序的阻塞甚至完全不阻塞。
有没有一种简单的方法在Python中异步写入文件?
我知道Python自带的文件IO是阻塞式的,在大多数情况下这是可以接受的。但对于特定情况,我需要尽可能地减少写入对应用程序的阻塞甚至完全不阻塞。
据我所知,异步 I/O 与非阻塞 I/O 不完全相同。
在非阻塞 I/O 的情况下,一旦设置文件描述符为“非阻塞”,例如进行 read()
系统调用时,如果读操作将会阻塞调用进程才能完成操作,则会返回 EWOULDBLOCK
(或 EAGAIN
)。提供了 select()
、poll()
、epoll()
等系统调用,以便进程可以请求操作系统告知一个或多个文件描述符何时变得可用,以执行某些 I/O 操作。
异步 I/O 是通过将 I/O 请求排队到文件描述符中独立地跟踪来实现的。对于支持异步 I/O 的文件描述符(通常是原始磁盘设备),进程可以调用 aio_read()
来请求从文件描述符中读取一定数量的字节。无论 I/O 是否完成,该系统调用都会立即返回。稍后,进程则轮询操作系统以获取 I/O 的完成情况(也就是缓冲区中填充了数据)。
Twisted提供了文件描述符上的非阻塞写入功能。如果你正在编写异步代码,我会预期你使用Twisted。 :)
Thread
:from threading import Thread
for file in list_file:
tr = Thread(target=file.write, args=(data,))
tr.start()
这更像是伪代码,但我希望你能理解。请注意,这里的线程是保持打开状态。
根据我的经验,它运行得很好,尽管解释器在主脚本完成后仍然需要一些时间才能工作(需要使用 join()
),因此速度提升并不像看起来那么大。
Python 3似乎具有这样的功能。请参见PEP 3116。