在Python中阻塞文件读取

3
我需要在Windows上读取二进制数据结构,这些数据被写入文件后立即刷新。我无法控制写入数据的程序,它是一个黑盒子LP模型,总是写入到一些硬编码的文件名,但我知道它会定期刷新输出。我想要同时从几个文件中读取这些数据,如果能够使用read(n)并且阻塞直到读取完整的n字节或者使用readinto(d)并且阻塞直到缓冲区已满那就非常方便了。在Windows上用Python实现这个功能是否可行?
我很难搜索到相关信息,因为所有人都只谈论非阻塞以及如何实现。但是我打算让子线程阻塞并通过队列将数据报告给不阻塞的父线程。
如果没有方法获得阻塞读取,那是否有避免忙等待或sleep()的方法?
1个回答

1
当在Python中读取文件时,默认情况下,该线程会阻塞同一进程中的所有其他线程进行工作--由于GIL的缘故,您可以免费获得此功能。
而当您从磁盘上获取二进制数据时,您可以读取N个字节的数据并与所需大小进行比较,必要时循环,并在完成后返回。
例如,以下是可运行的伪代码(您不应按原样实现):
my_file = open('/Users/tfisher/sputnik.m4a', 'rb')
megabyte_in_bytes = 1000000

def chunk_reader(file=my_file, chunk_size=megabyte_in_bytes):
    filesize = 0
    _return_chunk = bytearray()

    while filesize < chunk_size:

        print("Reading file. Current size: {0}".format(sys.getsizeof(_return_chunk)))

        # reading will keep seeking forward until the file is 
        # seek(0) or otherwise opened from the start
        _return_chunk = _return_chunk + file.read(10)
        filesize = filesize + sys.getsizeof(_return_chunk)

    return _return_chunk

print(chunk_reader())

如果您不想要一个繁忙的等待循环,您可以通过使用同步原语,如信号量或创建一个文件读取类,在同一进程中的其他线程中检查文件是否被锁定,并在开始read()时增加锁定值。

假设文件写入速度较慢,使用此方法会花费大量时间旋转,而read(10)返回0。我正在寻找一种方法,在等待文件中的新字节时保持线程等待,而不浪费处理器的时间。 - Jonathan Wallace
即使是win32模块和文件系统事件也需要在轮询之间进行一些休眠(如果我没记错的话,大约为0.5秒)。 - user559633

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接