Skip to main content
 首页 » 编程设计

python之当不同的对象写同一个文件时,我是否使用临界区

2025年05月04日17sxdcgaq8080

我写的类是用来记录错误信息的,有些对象会导入它来保存它的错误信息记录。我希望所有消息都写在同一个文件中。 我需要使用临界区吗?

如果我这样做。下面的代码有用吗?

global critical_section 
critical_section = 0 
 
class Recorder (object): 
    ... 
    def writeError(self, title, content): 
        global critical_section 
        while critical_section != 0 : 
            pass 
        critical_section = 1 
        file = open("system_error.log", "a") 
        msg = "[ "+title+" ] "+time.strftime("%Y/%m/%d %H:%M:%S : ")+content 
        file.write(msg) 
        file.close() 
        critical_section = 0 
    ... 

请您参考如下方法:

  1. 第一次出现“global”关键字是没有用的。此变量已经是全局变量。
  2. 您正在使用主动等待。真他妈丑。这就是信号量或锁等结构存在的原因。查看模块 threading .
  3. 全局变量既丑陋又错误。创建类级变量 file_lock 并使用它。最后您的代码可能如下所示:
from threading import Lock 
 
class Recorder(object): 
    file_lock = Lock() 
    def writeError(self, title, content): 
        with type(self).file_lock: 
            with open("system_error.log", "a") as f: 
                msg = ... 
                f.write(msg) 

为什么我使用 type(self).file_lock 而不是 self.file_lock?因为也可能有实例级变量 file_lock,我想确保我们使用的是类级锁。

还有一件事是,在追加到文件时(至少在 linux 上,刚才检查过)你可以从许多地方写入同一个文件,第一个刷新过程将首先写入。无论如何,确保一次只有一个人写入给定文件是一种很好的做法。

如您所见,我使用了上下文管理器(with open/lock)而不是 f=open(...) 或 lock.acquire() 。它有很多优点 - 即使引发异常,您也可以确定 file.close() 或 lock.release() 将被调用,并且您的代码更具可读性,这是一个很大的优势。

附言。重要:请参阅 Bakuriu 对这篇文章的评论,我忘了提到这一点,这很重要。