如何在芹菜任务中锁定变量?

时间:2017-08-16 21:58:43

标签: python asynchronous concurrency locking celery

我有一个芹菜任务,它会破坏一些变量。如果我设置一个单独的芹菜工作者它是完美的,但当我使用并发时,它都搞砸了。我怎么能锁定变量被破坏的关键部分?

inb4:使用Python 3.6,Redis既可以作为代理,也可以作为结果支持。 threading.Lock在这里没有帮助。

2 个答案:

答案 0 :(得分:1)

我知道这是2年以上的问题,但现在我正在调整我的芹菜配置,就来到了这个话题。

我在Linux机器上将python 2.7与Django 1.11和celery 4一起使用。我正在使用Rabbitmq作为经纪人。

我的配置意味着要让celery作为守护程序运行,并用celery beat来处理预定的任务。

因此,对于用于给定任务的专用队列,您可以使用并发= 1(子进程)的工作器(进程)配置此队列。

此解决方案解决了celery运行任务的并发问题,但是在您的代码中,如果您在不使用celery的情况下运行任务,则不会遵循并发原则。

示例代码:

CELERY_TASK_QUEUES = (
   Queue('celery_periodic', default_exchange, routing_key='celery_periodic'),
   Queue('celery_task_1', celery_task_1_exchange, routing_key='celery_task_1'),
)

default_exchange            = Exchange('celery_periodic', type='direct')
celery_task_1_exchange      = Exchange('celery_task_1', type='direct')

CELERY_BEAT_SCHEDULE = {
   'celery-task-1': {
       'task':     'tasks.celery_task_1',
       'schedule': timedelta(minutes=15),
       'queue':    'celery_task_1'
   },
}

最后是在/ etc / default / celeryd中(此处的文档:https://docs.celeryproject.org/en/latest/userguide/daemonizing.html#example-configuration):

CELERYD_NODES="worker1 worker2"
CELERYD_OPTS="--concurrency=1 --time-limit=600 -Q:worker1 celery_periodic -Q:worker2 celery_task_1"

-并发N表示您的工作程序实例将有N个工作程序子进程(这意味着工作程序实例可以处理N个并发任务)(来自https://stackoverflow.com/a/44903753/9412892)。

在此处了解更多信息:https://docs.celeryproject.org/en/stable/userguide/workers.html#concurrency

BR, 爱德华多

答案 1 :(得分:0)

只要芹菜在多个工作程序(进程)上运行,线程锁就无济于事,因为它在单个进程中运行。此外,当你控制整个过程时,线程锁有用,而使用芹菜则没有办法实现这一点。

这意味着芹菜需要分布式锁定。对于django,我总是使用django-cache,如:here。如果您需要更多通用锁,特别是基于Redis,可以使用任何python应用程序sherlock