2014-04-08 119 views
0

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

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

+0

实际上,你能否解释一下你的用例:当你平行说,你的意思是什么? –

+0

完成以上....! – postelrich

回答

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 
+0

你能详细说说你的意思吗? – postelrich

+0

查看我的更新回答 – aIKid

+0

这难道不是他们试图同时从counter.txt读取的同一个问题吗? – postelrich

0

你可以利用像uuid如果不是唯一的名字是你所追求的。

编辑:

如果你想读,但是唯一的名字,我会建议你寻找到与锁定守着你上面的增量语句,这样,只有一个进程在任何时间点可能增加它也使文件创建和增量操作成为原子。

+0

是的,但我想保持简短和可读性。 – postelrich

+0

@riotburn我在上面添加了一条建议。 –

+0

这是一个很好的建议,谢谢! – postelrich

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 
相关问题