Проблемы совместного использования переменных в сельдерее - PullRequest
3 голосов
/ 28 декабря 2011

Я использую 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 ) объект?Прямо сейчас они используют один и тот же объект, что приводит к сбою моего приложения.Это возможно?

1 Ответ

5 голосов
/ 28 декабря 2011

Они используют один и тот же объект, потому что вы явно указываете это в своем коде.Создавая объект вне области действия задачи и используя его в задаче, вы предоставляете всем работникам доступ к общему объекту.Это проблема параллелизма, не обязательно проблема сельдерея.Вы можете использовать копию объекта, если он маленький, или использовать собственную стратегию блокировки.В целом, хотя, если объект будет обновляться более чем одним процессом одновременно, ему необходимо использовать какую-то синхронизацию, которая выходит за рамки Celery.

...