首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >非阻塞文件读取

问非阻塞文件读取
EN

Stack Overflow用户
提问于 2016-10-10 05:12:12
回答 3查看 8.3K关注 0票数 13

如何在非阻塞模式下读取二进制文件或文本文件的内容?

对于二进制文件:当我

,我得到了一个

..。文档堡垒

说

读取并返回大小字节,或者如果未给出大小或大小为负数,则在EOF之前或如果读取调用将在非阻塞模式下阻塞。

显然是一个直截了当的

处于阻塞模式。令我惊讶的是,我在任何地方都找不到一个解释

如何选择非阻塞模式的文档。

对于文本文件:当我

,我得到了

..。我假设相关文档是用于

在它的基类中,

;及

根据这些文件

,似乎根本没有办法进行非阻塞读取:

从流中读取和返回最大长度的字符作为单个字符串。如果大小为负或无,则读取直到EOF。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-10-10 05:36:19

文件操作正在阻塞。没有非阻塞模式。

但是你可以创建一个在后台读取文件的线程。在Python 3中,

模块

在这里可能很有用。

代码语言:javascript
复制
from concurrent.futures import ThreadPoolExecutor

def read_file(filename):
    with open(filename, 'rb') as f:
        return f.read()

executor = concurrent.futures.ThreadPoolExecutor(1)
future_file = executor.submit(read_file, 'C:\\Temp\\mocky.py')

# continue with other work

# later:

if future_file.done():
    file_contents = future_file.result()

或者,如果您需要在操作完成时调用回调:

代码语言:javascript
复制
def on_file_reading_finished(future_file):
    print(future_file.result())

future_file = executor.submit(read_file, 'C:\\Temp\\mocky.py')
future_file.add_done_callback(on_file_reading_finished)

# continue with other code while the file is loading...
票数 11
EN

Stack Overflow用户

发布于 2021-02-28 23:21:21

Python确实支持非阻塞读取,至少在Unix类型的系统上是这样的,方法是将

标志

..。在Python 3.5+中,有

函数

这使得这件事变得更容易:

代码语言:javascript
复制
import os
f = open(filename, 'rb')
os.set_blocking(f.fileno(), False)
f.read()  # This will be non-blocking.

但是,由于

zvone的答案

注意,这不一定适用于实际的磁盘文件。这不是Python的问题,而是操作系统的限制。作为Linux

打开(2)手册页

状态:

请注意,此标志对常规文件和数据块设备无效;也就是说,当需要设备活动时,I/O操作将(短暂地)阻塞,无论O

_

已设置NONBLOCK。

但它确实表明这可能会在未来实现:

因为O

_

NONBLOCK语义可能最终会实现,当为常规文件和块设备指定此标志时,应用程序不应依赖于阻塞行为。

票数 6
EN

Stack Overflow用户

发布于 2016-10-10 05:19:28

我建议使用

aiofiles文件

-一个用于在异步应用程序中处理本地磁盘文件的库。

代码语言:javascript
复制
f = yield from aiofiles.open('filename', mode='r')
try:
    contents = yield from f.read()
finally:
    yield from f.close()
print(contents)
'My file contents'

异步样式版本

代码语言:javascript
复制
async def read_without_blocking():
    f = await aiofiles.open('filename', mode='r')
    try:
        contents = await f.read()
    finally:
        await f.close()
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39948588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档