每个实例创建的新文件

时间:2014-04-08 04:02:24

标签: python file static-variables

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

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个工人,所以我实际上无法管理它们之间的通信。

3 个答案:

答案 0 :(得分:0)

简单,只需使用另一个文本文件来保存文件名和您需要识别的数字/代码。您可以使用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

答案 1 :(得分:0)

如果您追求的是唯一名称,则可以使用uuid之类的内容。

编辑:

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

答案 2 :(得分:0)

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

我发现的另一个解决方案是使用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