23

有没有一种简单的方法在 Python 中异步写入文件?

我知道Python 自带的文件 io被阻塞了;在大多数情况下这很好。对于这种特殊情况,我需要写入根本不阻塞应用程序,或者至少尽可能少地阻塞。

4

5 回答 5

18

据我了解,异步 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 是否完成(即缓冲区已充满数据)。

仅执行非阻塞 I/O 的进程(单线程)将能够从一个已准备好 I/O 的文件描述符读取或写入,而另一个文件描述符尚未准备好。但是该进程仍必须同步发出系统调用以对所有准备好的文件描述符执行 I/O。而在异步 I/O 的情况下,该进程只是检查 I/O 的完成情况(缓冲区充满数据)。使用异步 I/O,操作系统可以自由地尽可能多地并行操作以服务于 I/O,如果它愿意的话。

有了这个,对于 Python 的 POSIX aio_read/write 等系统调用是否有任何包装器?

于 2009-06-11T21:19:29.403 回答
4

Twisted在文件描述符上有非阻塞写入。如果您正在编写异步代码,我希望您使用twisted,无论如何。:)

于 2008-11-25T22:46:15.037 回答
3

您可以尝试使用Thread

from threading import Thread

for file in list_file:
     tr = Thread(target=file.write, args=(data,))
     tr.start()

这或多或少是一个伪代码,但我希望你能明白。请注意这里的线程是打开的。

根据我的经验,它运行良好,虽然解释器在主脚本完成(需要使用)时继续工作一段时间join(),所以速度增益比看起来大得多

于 2018-05-24T13:59:37.843 回答
2

我正在为 python 开发 aio.h bidings:pyaio

它只在linux上运行..

于 2011-06-16T20:45:00.537 回答
0

Python 3 似乎有这样的功能。参见PEP 3116

于 2010-11-06T21:15:45.897 回答