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

标签 python python-2.7 file-io

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

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

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 对这篇文章的评论,我忘了提到这一点,这很重要。

关于python - 当不同的对象写同一个文件时,我是否使用临界区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21138724/

相关文章:

python - AWS Lambda 上的单元测试

python - 如何在不导入自定义widget类包的情况下使用自定义widget和uic.loadUi?

python - 如果 y 为负数,为什么 x**y%z 不能像 pow(x, y, z) 一样工作?

python - 将id值存储在字典中还是重新查询数据库是否更有效

python-2.7 - ValueError : Tensor:(. ..) 不是该图的元素

python-2.7 - python - 特定日期的电报机器人sendMessage

python - super() 返回的 super 对象的类型是什么?

c - 从文件中写入和读取并按升序对它们进行排序

java - 交错并行文件读取比顺序读取慢?

java - 写入问题——丢失原始数据