我写的类是用来记录错误信息的,有些对象会导入它来保存它的错误信息记录。我希望所有消息都写在同一个文件中。 我需要使用临界区吗?
如果我这样做。下面的代码有用吗?
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
...
请您参考如下方法:
- 第一次出现“global”关键字是没有用的。此变量已经是全局变量。
- 您正在使用主动等待。真他妈丑。这就是信号量或锁等结构存在的原因。查看模块 threading .
- 全局变量既丑陋又错误。创建类级变量
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 对这篇文章的评论,我忘了提到这一点,这很重要。
