프로젝트에서 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) 개체를 사용하도록 코드를 수정하려면 어떻게해야합니까? 현재, 그들은 동일한 객체를 공유하고 있습니다. 즉, 내 응용 프로그램이 충돌하게됩니다. 이것이 가능한가?
동일한 개체가 아닙니다. 셀러리는 프로세스를 복사합니다. 이 경우 동일한 md5 개체 ID를 제공합니다. –