读取未完成文件的风险

时间:2018-10-14 20:06:19

标签: python multithreading

我已经执行一段代码了一段时间,但从未遇到错误。但是,代码中似乎有一个危险的部分,由于它是一个多线程程序,因此幸运的是它还没有崩溃。

我的程序包含两个线程。一种是写文件,另一种是不断扫描这些文件,然后读取并进一步处理。我担心的是第二个线程可能会尝试读取第一个线程尚未完全写入磁盘的文件,从而导致其崩溃。

这似乎没事。是纯粹的运气还是仅在文件完全写入磁盘后才出现文件名?

1 个答案:

答案 0 :(得分:1)

是的,听起来您有一个race condition。您需要确保读者不会尝试阅读超出书面内容的内容,或者至少以某种方式处理该错误。

我解决此类问题的首选方法是使用线程安全queue。写入线程可以在写入完成后将文件的名称或路径放在队列 中。读取线程等待队列上的新文件名(使用queue.get()),然后处理该文件。

您可能想要某种在处理完所有文件后安全关闭阅读器线程的机制。好的机制是将标记值放在队列中,这将向读者表明其工作已完成。前哨的常见选择是None。因此阅读线程将具有以下内容:

while True:
    filename = q.get()
    if filename is None:
        break
    process_file(filename)

而编写线程将具有一个类似于以下内容的循环:

for filename in filenames:
    write_file(filename)
    q.put(filename)
q.put(None)