【问题标题】:Blocking file read in python阻止在python中读取文件
【发布时间】:2015-09-10 18:23:40
【问题描述】:

我需要读取二进制数据结构,因为它们被刷新到 Windows 中的文件中。我无法控制写入数据的程序,它是一个黑盒 LP 模型,总是写入一些硬编码的文件名,但我知道它会定期刷新它的输出。我想一次从多个文件中读取这些数据。为每个文件分叉一个线程没有问题,但是如果我可以使用 read(n) 并让它阻塞直到它读取 整个 n 个字节或 readinto( d) 让它阻塞直到缓冲区满。这可以在 Windows 上的 Python 中实现吗?

我很难找到这个,因为所有人都在谈论非阻塞以及如何做到这一点。但是通过这个解决方案,我打算让孩子阻止并通过队列将数据报告给不阻止的父母。

如果没有办法获得阻塞读取,有没有办法避免忙等待或睡眠()?

【问题讨论】:

    标签: python python-3.x io binaryfiles blocking


    【解决方案1】:

    在 Python 中读取文件时,默认情况下,该线程会阻止所有其他线程在同一进程中工作——由于 GIL,您可以免费获得此功能。

    虽然您是在二进制数据到达磁盘时读取它,但您可以读取 N 个字节的数据并与您想要的大小进行比较,根据需要循环,完成后returning。

    例如作为一些可运行的伪代码(你应该按原样实现):

    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())
    

    如果您不想要一个繁忙的等待循环,您可以通过使用synchronization primitives like semaphores 或创建一个在启动时增加锁定值的文件读取类来检查文件是否被锁定在同一进程内的其他线程中到read()

    【讨论】:

    • 假设文件写入缓慢,这种方法会花费大量时间在 read(10) 返回 0 时旋转。我正在寻找一种方法来保持线程等待新字节文件而不浪费处理器的时间。
    • 即使是 win32 模块和 file system events 在轮询之间也会有一些睡眠(0.5 秒 IIRC)。
    猜你喜欢
    • 1970-01-01
    • 2016-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-09
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多