同一个文件中一个线程写入和一个线程读取是否安全?

问题描述 投票:0回答:1

我需要一个Python脚本,其中后台线程将数据写入文件,而主线程可能从中读取数据。

我知道从多个线程写入文件可能会出现问题,但是如果只有一个线程以写入模式打开文件,而另一个线程仅以读取模式打开文件,可以吗?

我制作了一个小型测试程序,到目前为止它可以工作,但这会在更复杂的程序中产生问题吗?

from threading import Thread
from time import sleep

class Writter(Thread):
    def __init__(self) -> None:
        super().__init__()
    
    def run(self):
        print("Sampler started")
        with open("testfile.txt", mode='w') as f:
            i = 0
            while True:
                new_line = f"{i}\n"
                f.write(new_line)
                f.flush()
                i += 1
                sleep(1)

if __name__ == '__main__':
    writter = Writter()
    writter.start()
    sleep(2)
    with open("testfile.txt", mode='r') as f:
        while True:
            new_line = f.readline()
            if new_line != '':
                print(new_line)

我之前在其他项目中使用过队列,但在这里不适合。我需要将数据写入文件,因为读取数据的代码并不总是同时运行。我可以同时执行这两种操作,写入文件并另外写入队列,以便读取器和写入器同时运行。但随后我必须向读取器添加检查,看看它是否需要读取文件或者是否可以使用队列。

如果上面的代码没问题的话,那就更简单了。有什么办法可以打破这个吗?

python thread-safety python-multithreading
1个回答
0
投票

如果你是从并发的角度来问,那没问题。只有一个线程写入文件,多个线程可以从文件中读取数据而不会损坏数据。

但是这里的另一个问题是,如果写入器线程写入缓慢,读取器线程将在没有任何睡眠的情况下循环 -> 浪费CPU。

您也可以在那里添加 sleep 或使用像 https://pypi.org/project/watchdog/ 这样的项目,它基本上会通知您文件系统中的某些内容是否发生更改。这可能就是你的情况。

© www.soinside.com 2019 - 2024. All rights reserved.