我写的类是用来记录错误信息的,有些对象会导入它来保存它的错误信息记录。我希望所有消息都写在同一个文件中。 我需要使用临界区吗?
如果我这样做。下面的代码有用吗?
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 对这篇文章的评论,我忘了提到这一点,这很重要。
关于python - 当不同的对象写同一个文件时,我是否使用临界区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21138724/