python异步保存文件_可以在python中异步写入文件吗?

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

我知道Python随附的文件io会阻塞; 在大多数情况下都可以。 对于这种特殊情况,我需要写任何内容都不要或至少最小程度地阻止应用程序。

据我了解,异步I / O与非阻塞I / O不太相同。

在非阻塞I / O的情况下,一旦将文件描述符设置为"非阻塞",read()系统调用(例如)将在读取操作后返回EWOULDBLOCK(或EAGAIN)。将阻止调用过程以完成操作。提供了系统调用select(),poll(),epoll()等,以便进程可以在一个或多个文件描述符可用于执行某些I / O操作时要求告知OS。

异步I / O通过将对I / O的请求排队到文件描述符中来进行操作,而该文件描述符独立于调用过程进行跟踪。对于支持异步I / O(通常为原始磁盘设备)的文件描述符,进程可以调用aio_read()(例如)以请求从文件描述符读取多个字节。无论I / O是否完成,系统调用都会立即返回。一段时间后,该过程然后轮询操作系统以完成I / O(即,缓冲区中已填充数据)。

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

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

要添加的一件事:正如第一个响应的评论者所说,实际上没有系统在文件上遵循O_NONBLOCK -实际上仅用于套接字。如果要在Unix上使用可移植的异步文件IO,则必须使用POSIX AIO或将同步IO卸载到线程池中。

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

令人遗憾的是,O_NONBLOCK(您链接到的fdesc API确实具有的功能)不适用于本地硬盘文件。即POSIX规范说应该忽略它,并且在我所知道的每个UNIX系统上都应该完全忽略它。如果您认为这是一个愚蠢的主意,那么我不能同意,但是这样做有很多历史和实施原因。简而言之,如果要异步IO到本地硬盘文件,则最好使用线程并将IO推迟到IO线程或使用AIO API。

您可以尝试使用Thread:

1

2

3

4

5from threading import Thread

for file in list_file:

tr = Thread(target=file.write, args=(data,))

tr.start()

这或多或少是一个伪代码,但我希望您能理解。请注意,此处的线程保持打开状态。

以我的经验,它可以很好地工作,尽管在主脚本完成后解释器仍可以继续工作一段时间(需要使用join()),所以速度提高的幅度比看上去大得多。

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

它仅在Linux上运行。

Python 3似乎具有这种功能。参见PEP 3116。

看起来PEP 3116与包含非阻塞I / O的新I / O抽象有关。但是,非阻塞I / O与异步I / O不同。非阻塞I / O通常不适用于本地文件系统写入。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值