2011-12-28 3 views
2

프로젝트에서 Python과 celery을 사용하고 있습니다. 프로젝트에서, 나는 두 개의 파일이 있습니다셀러리 작업자 변수 공유 문제

celeryconfig.py

BROKER_URL = "amqp://guest:[email protected]:5672//" 
CELERY_RESULT_BACKEND = "amqp" 
CELERY_IMPORTS = ("example",) 
CELERYD_CONCURRENCY = 2 

example.py

from celery.task import task 
import hashlib 

md5 = hashlib.md5() 

@task 
def getDigest(text): 
    print 'Using md5 - ',md5 
    md5.update(text) 
    return md5.digest() 

celeryconfig.py에서를, 나는 CELERYD_CONCURRENCY 설정 ~ 이는 di 내 작업 대기열의 작업을 다른 프로세스에 전념하십시오. 파이썬 콘솔에서

, 나는 실행

from example import getDigest 
getDigest.delay('foo');getDigest.delay('bar') 

이 동시에 두 노동자에 의해 실행되는 두 개의 작업을 만듭니다. 두 작업자 프로세스가 모두 자신의 작업 함수 [getDigest()]를 실행하기 때문에 동일한 해시 개체 (md5)를 사용하고있는 것으로 보입니다. celeryd의 출력은 아래에서 확인할 수 있습니다. 간단하게하기 위해서

[PoolWorker-2] Using md5 - 
[PoolWorker-2] <md5 HASH object @ 0x23e6870> 
[PoolWorker-1] Using md5 - 
[PoolWorker-1] <md5 HASH object @ 0x23e6870> 

, 나는 hashlib의 MD5 객체를 사용하고,하지만 내 실제 프로젝트에, 나는 액세스 더 이상의 프로세스에 의해 변경 될 수없는 객체를 사용하고 있습니다. 이것은 예상대로 노동자들이 추락하게 만든다.

질문 : 작업자 프로세스가 초기화되고 자신의 (md5) 개체를 사용하도록 코드를 수정하려면 어떻게해야합니까? 현재, 그들은 동일한 객체를 공유하고 있습니다. 즉, 내 응용 프로그램이 충돌하게됩니다. 이것이 가능한가?

답변

5

코드에서 명시 적으로 말하고 있기 때문에 동일한 객체를 사용하고 있습니다. 작업의 범위 밖에있는 개체를 만들어 작업 내에서 사용하면 모든 작업자가 공유 개체에 액세스 할 수있게됩니다. 이는 동시성 문제이며 반드시 샐러리 문제는 아닙니다. 객체가 작 으면 객체 복사본을 사용하거나 자체 잠금 전략을 사용할 수 있습니다. 그러나 일반적으로 개체가 한 번에 둘 이상의 프로세스에서 업데이트 될 경우 셀러 리 범위를 벗어나는 일종의 동기화를 사용해야합니다.

+2

동일한 개체가 아닙니다. 셀러리는 프로세스를 복사합니다. 이 경우 동일한 md5 개체 ID를 제공합니다. –