Python 读取未完成文件的风险

Python 读取未完成文件的风险,python,multithreading,Python,Multithreading,我已经执行一段代码有一段时间了,它从来没有遇到错误。然而,代码中似乎有一个危险的部分,因为它是一个多线程程序,所以可能很幸运它还没有崩溃 我的程序包含两个线程。一个是写文件,另一个是不断扫描这些文件,然后读取和进一步处理。我担心的是,第二个线程可能试图读取第一个线程尚未完全写入磁盘的文件,从而导致磁盘崩溃 不过,事情似乎进展顺利。这纯粹是运气使然,还是文件名只有在文件完全写入磁盘后才会出现?是的,听起来你有一个新的文件名。您需要确保读取器不会尝试读取超过已写入的内容,或者至少以某种方式处理该错误

我已经执行一段代码有一段时间了,它从来没有遇到错误。然而,代码中似乎有一个危险的部分,因为它是一个多线程程序,所以可能很幸运它还没有崩溃

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


不过,事情似乎进展顺利。这纯粹是运气使然,还是文件名只有在文件完全写入磁盘后才会出现?

是的,听起来你有一个新的文件名。您需要确保读取器不会尝试读取超过已写入的内容,或者至少以某种方式处理该错误

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

您可能需要某种机制,在处理完所有文件后安全地关闭读卡器线程。一个好的机制是在队列上放置一个sentinel值,这将向读者指示其工作已经完成。哨兵的常见选择是
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)

我相信它是幸运的,而且该文件是在写入之前创建的。因此,最好在两个线程之间共享一个列表或变量,表示used_file=“foo.txt”,如果读取线程尝试读取filename==used_file,请等待filename!=用过的文件?我可能完全错了,但这可能是一个不好的建议!我也可以尝试使用try来解决这个问题。如果文件读取失败,它将在下一次运行时重试。try将处理读取错误(这是一个好主意),但不会处理您将面临的竞争条件。ie在完成调整之前读取不完整的文件,如果读取器正在读取在脚本运行之前创建的文件(或从其他源创建的文件),则此解决方案不起作用