如何在非阻塞模式下读取二进制文件或文本文件的内容?
对于二进制文件:当我
,我得到了一个
..。文档堡垒
说
读取并返回大小字节,或者如果未给出大小或大小为负数,则在EOF之前或如果读取调用将在非阻塞模式下阻塞。
显然是一个直截了当的
处于阻塞模式。令我惊讶的是,我在任何地方都找不到一个解释
如何选择非阻塞模式的文档。
对于文本文件:当我
,我得到了
..。我假设相关文档是用于
在它的基类中,
;及
根据这些文件
,似乎根本没有办法进行非阻塞读取:
从流中读取和返回最大长度的字符作为单个字符串。如果大小为负或无,则读取直到EOF。
发布于 2016-10-10 05:36:19
文件操作正在阻塞。没有非阻塞模式。
但是你可以创建一个在后台读取文件的线程。在Python 3中,
模块
在这里可能很有用。
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()或者,如果您需要在操作完成时调用回调:
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...发布于 2021-02-28 23:21:21
Python确实支持非阻塞读取,至少在Unix类型的系统上是这样的,方法是将
标志
..。在Python 3.5+中,有
函数
这使得这件事变得更容易:
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语义可能最终会实现,当为常规文件和块设备指定此标志时,应用程序不应依赖于阻塞行为。
发布于 2016-10-10 05:19:28
我建议使用
aiofiles文件
-一个用于在异步应用程序中处理本地磁盘文件的库。
f = yield from aiofiles.open('filename', mode='r')
try:
contents = yield from f.read()
finally:
yield from f.close()
print(contents)
'My file contents'异步样式版本
async def read_without_blocking():
f = await aiofiles.open('filename', mode='r')
try:
contents = await f.read()
finally:
await f.close()https://stackoverflow.com/questions/39948588
复制相似问题