2013-01-25 5 views
4

셀 파일을 사용하여 여러 파일로 출력하려고합니다. 이 작업은 매우 간단합니다 :셀로어를 사용하여 파일로 출력

  • 파일 경로
  • 추가]와 함께 일부 데이터를 가져 오십시오 파일 경로 데이터 (그리고 존재하지 않는 경우 파일을 작성)

내가 할 많은 경우에 같은 파일에 쓸 것이므로 매번 파일 핸들을 열고 닫고 싶지 않습니다. 그래서 간단한 FileHandlePool을 만들었습니다.

그러나 실행할 때 각 스레드/인스턴스에 대해 셀러리가 새로운 FileHandlePool을 만들 것입니다! 따라서 파일을 덮어 쓰게됩니다.

이 상황을 처리하는 가장 좋은 방법은 무엇입니까? m FileHandlePool을 주 스레드와 동일한 범위에두고 다른 셀러리 스레드에 액세스 할 수 있습니까?

감사합니다.

+0

Celery를 스레드 모드로 실행 중이거나 별도의 프로세스로 실행 중입니까? –

+0

나는 스레드 모드라고 생각합니다. Celery 튜토리얼 – chaimp

+0

에서 기본 설정을 사용하여 샐러리 기본값이 작업자 풀에서 별도의 프로세스를 사용합니다. CELERYD_POOL 구성 매개 변수를 사용하여이를 보강 할 수 있습니다. –

답변

3

풀은 샐러리 스레드가 공유하지 않는 것 같습니다. 이상적인 방법은 하나의 프로세스에 파일 쓰기 작업을 할당하고 모든 셀러리 스레드가 큐를 통해 해당 프로세스에 쓰도록하는 것입니다.

+0

그건 내가하고 싶은 일이다. 나는 그 질문에 잘 묘사하지 않았다고 생각한다. 그럼 ... 어떻게해야합니까? – chaimp

+2

필자는 항상 튜토리얼 http://www.ibm.com/developerworks/aix/library/au-threadingpython/을 참조했습니다. – djinn

1

별도의 서비스 (Celery 외부)를 파일에 동기화하지 않으려면 Celery에서이 작업을 수행하는 방법은 하나의 작업자 풀 (동시성이있는 풀)을 특정 대기열에 바인딩하는 것입니다 파일 쓰기 작업 만 허용합니다. 이렇게하면 작업이 순차적으로 실행되며 작성하는 동안 경쟁 조건이 없습니다.

대체로 사용자가 제안한대로 CELERYD_POOL 모드를 변경하여 스레딩을 사용하고 파일 핸들 참조를 작업 인스턴스에 저장하여 다른 작업자 스레드에서 액세스 할 수 있습니다. 그때 파일 핸들 스레드 안전하다고 가정합니다.

+0

CELERYD_POOL을 어떻게 변경해야하는지에 대한 간단한 예제를 제공해 주시겠습니까? – chaimp