Я использую Python и сельдерей в проекте.В проекте у меня есть два файла:
celeryconfig.py
BROKER_URL = "amqp://guest:guest@localhost: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 на 2 , что означает, что он будет распределять задачи в моей очереди на 2 разные процессы.
С консоли Python я запускаю:
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>
Для простоты я использую объект md5 hashlib, но в моем реальном проекте яиспользуя объект, к которому нельзя получить доступ и изменить более чем одним процессом.Это, как ожидается, приводит к краху рабочих.
В связи с этим возникает вопрос: как я могу изменить свой код, чтобы рабочие процессы инициализировали и использовали свой собственный ( md5 ) объект?Прямо сейчас они используют один и тот же объект, что приводит к сбою моего приложения.Это возможно?