可以在python中编写异步文件吗?

Ray*_*ySl 21 python asynchronous aio-write

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

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

小智 17

据我所知,异步I/O与非阻塞I/O并不完全相同.

在非阻塞I/O的情况下,一旦文件描述符被设置为"非阻塞",如果读取操作将阻止调用进程以完成,则read()系统调用(例如)将返回EWOULDBLOCK(或EAGAIN)操作.系统调用select(),poll(),epoll()等被设置成该过程可以要求被告知OS当一个或多个文件描述符成为可供执行一些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提供服务,如果它选择的话.

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


Dus*_*tin 5

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

  • 遗憾的是,O_NONBLOCK(这是您链接到的 fdesc API 的真正功能)不适用于本地硬盘文件。即,POSIX 规范规定它应该被忽略,并且在我所知道的每个 UNIX 系统上它都被尽职地忽略。如果您认为这是一个愚蠢的想法,我完全同意,但造成这种情况有很多历史和实施原因。简而言之,如果要对本地硬盘文件进行异步IO,最好使用线程并将IO延迟到IO线程或使用AIO API。 (13认同)