2014-04-08 7 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에 의해 제공됩니다 내 애플 리케이션,이 클래스 생성되고있다
. 그래서 나는 10 명의 근로자를 말하면서 그들 사이의 통신을 실제로 관리 할 수는 없다.

+0

사실 실제로 사용 사례를 조금 더 설명 할 수 있습니까? 평행하게 말할 때 정확히 어떻게 의미합니까? –

+0

done ....! – postelrich

답변

0

쉽게 다른 텍스트 파일을 사용하여 파일 이름과 식별해야하는 번호/코드를 유지하십시오. JSON, 피클 또는 자신 만의 형식을 사용할 수 있습니다.

__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 게하십시오.

+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