每个实例创建的新文件



我有一个需要写入文件的类。 我的程序创建了多个这样的类,我想避免写入冲突。 我试图通过使用静态变量来避免它,因此每个类都有一个唯一的文件名。即:

class Foo:
    instance_count = 1
    @staticmethod
    def make():
        file_name = Foo.instance_count + '-' + 'file.foo'
        Foo.instance_count += 1
        Foo(file_name)
    def Foo(self, fname):
        self.fname = fname

这在某种程度上有效,但在可能并行创建类的情况下不起作用。 如何使其更强大?

编辑
我的用例在我的应用程序中创建了这个类,它由 gunicorn 提供。 所以我用gunicorn启动了我的应用程序,假设有10个工人,所以我实际上无法管理他们之间的通信。

您可以使用uuid之类的东西,如果唯一名称是您所追求的。

编辑:

如果你想要可读但唯一的名称,我建议你考虑用锁保护上面的增量语句,以便只有一个进程在任何时间点增加它,并且可能使文件创建和增量操作原子化。

很简单,只需使用另一个文本文件来保留文件名和您需要识别的数字/代码。您可以使用 JSON、pickle 或仅使用您自己的格式。

__init__函数中,您可以读取文件。然后,根据您获得的信息创建一个新文件。

文件示例:

File1.txt,1
Fil2e.txt,2

__init__功能:

def __init__(self):
    counter = int(open('counter.txt', 'r').read()[-2:].strip())
    with open("File%d.txt"%counter+1, "w"):
         #do things
    #don't forget to keep the information of your new file
实际上,

我正在寻找一种避免写入争用的方法。 然后我意识到为什么不直接使用记录器。可能是一个错误的假设,但我想记录器会负责锁定文件以进行写入。 此外,它在每次写入时都会刷新,因此它满足了该要求。 至于速度,在这种情况下,开销绝对不会影响我。

我发现的另一个解决方案是使用 tempfile 类。 这将为类的每个实例化创建一个唯一的文件。

import tempfile as tf
class Foo:
    @staticmethod
    def make():
        file_name = tf.NamedTemporaryFile('w+',suffix="foofile",dir="foo/dir")
        Foo(file_name)
    def __init__(self, fname):
        self.fname = fname

相关内容

  • 没有找到相关文章