我有一个简单的celery + django设置,可以正常工作,直到将Queue
更改为Broadcast
,而不是所有工人都没有完成任务,而他们都没有。
from __future__ import absolute_import, unicode_literals
import os
from kombu.common import Broadcast
from billiard import current_process
from celery import Celery
from kombu import Queue
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'celery_tutorial.settings')
app = Celery('celery_tutorial')
# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
# should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')
# exchange = Exchange('custom_exchange', type='fanout')
# app.conf.task_queues = (Broadcast('broadcast_tasks'),)
app.conf.task_queues = (Queue('broadcast_tasks'),)
# Load task modules from all registered Django app configs.
app.autodiscover_tasks()
app.conf.task_routes = {
'tasks.debug_task': {
'queue': 'broadcast_tasks',
'exchange': 'broadcast_tasks'
}
}
@app.task(bind=True)
def debug_task(self):
print(f'worker id: {current_process().index}')
现在,当我提交任务时,它可以正常工作:
from celery_tutorial.celery import debug_task
debug_task.apply_async(queue='broadcast_tasks')
工人日志:
[2020-10-31 16:44:50,770:警告/ ForkPoolWorker-2]工人ID:1
如果我将Queue
更改为Broadcast
,将不会在工作日志中显示任何内容。
(我以celery -A celery_tutorial.celery worker -c 2 -Q broadcast_tasks
经营工人)
PS:我将redis切换为amqp,现在其中一名工作人员获得了任务,而第二名则没有。