2014-04-08 160 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 
相關問題