我有一个芹菜任务,它会破坏一些变量。如果我设置一个单独的芹菜工作者它是完美的,但当我使用并发时,它都搞砸了。我怎么能锁定变量被破坏的关键部分?
inb4:使用Python 3.6,Redis既可以作为代理,也可以作为结果支持。 threading.Lock在这里没有帮助。
答案 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)