在Python中是否可以通过简单的方式异步写入文件?
我知道file io that comes with Python正在封锁;这在大多数情况下都很好。对于这种特殊情况,我需要写入根本不阻止应用程序,或者至少尽可能少地阻止应用程序。
答案 0 :(得分:17)
据我所知,异步I / O与非阻塞I / O并不完全相同。
在非阻塞I / O的情况下,一旦文件描述符被设置为“非阻塞”,read()
系统调用(例如)将返回EWOULDBLOCK
(或{ {1}})如果读操作将阻止调用进程以完成操作。提供了系统调用EAGAIN
,select()
,poll()
等,以便当一个或多个文件描述符变为可用时,进程可以要求操作系统被告知用于执行某些I / O操作。
异步I / O通过将对I / O的请求排队到文件描述符来进行操作,独立于调用进程进行跟踪。对于支持异步I / O(通常是原始磁盘)的文件描述符,进程可以调用epoll()
(例如)来请求从文件描述符中读取多个字节。无论I / O是否完成,系统调用都会立即返回。一段时间后,该过程然后轮询操作系统以获取I / O的完成(即缓冲区充满数据)。
仅执行非阻塞I / O的进程(单线程)将能够从一个已准备好进行I / O的文件描述符中读取或写入另一个尚未就绪的文件描述符。但是,该进程仍必须同步发出系统调用,以对所有就绪文件描述符执行I / O.然而,在异步I / O情况下,该过程只是检查I / O(填充数据的缓冲区)的完成情况。通过异步I / O,操作系统可以自由地并行操作,以便为I / O提供服务,如果它选择的话。
有了这个,对于Python的POSIX aio_read / write等系统调用是否有任何包装器?
答案 1 :(得分:4)
Twisted有non-blocking writes on file descriptors。如果您正在编写异步代码,我希望您使用twisted,无论如何。 :)
答案 2 :(得分:2)
我正在为python开发aio.h:pyaio
它只在linux上运行..
答案 3 :(得分:2)
您可以尝试使用Thread
:
from threading import Thread
for file in list_file:
tr = Thread(target=file.write, args=(data,))
tr.start()
这或多或少是一种伪代码,但我希望你能得到这个想法。请注意,这里的线程保持打开状态。
根据我的经验,它运作良好,虽然解释器在主脚本完成时需要继续工作一段时间(需要使用join()
),因此速度增益比看起来大得多
答案 4 :(得分:0)
Python 3似乎有这样的功能。请参阅PEP 3116。