【问题标题】:celery task in multiple queues not start多个队列中的芹菜任务无法启动
【发布时间】:2024-08-07 17:00:02
【问题描述】:

我使用 django 与 celery 和 redis 来处理异步任务。 我定义了三个任务,它们应该在您自己的队列中运行。

我的项目结构如下:

django-project
   |- api
      |- task.py
      |- view.py
   |- django-project
      |- settings.py
      |- celery.py
      |- __init__.py

我的 api 应用中 task.py 中定义的任务:

@shared_task
def manually_task(website_id):
    print("manually_task");
    website = Website.objects.get(pk=website_id)
    x = Proxy(website, "49152")
    x.startproxy()
    x = None


@periodic_task(run_every=(crontab(hour=19, minute=15)), ignore_result=True)
def periodically_task():
    websites = Website.objects.all()

    for website in websites:
        x = Proxy(website, "49153")
        x.startproxy()
        x = None


@shared_task
def firsttime_task(website_id):
    website = Website.objects.get(pk=website_id)
    x = Proxy(website, "49154")
    x.startproxy()
    x = None

现在这是我的 init.py

__all__ = ('celery_app',)

以及settings.py中的celery设置:

CELERY_BROKER_URL = 'redis://localhost:6379'
CELERY_RESULT_BACKEND = 'redis://localhost:6379'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TASK_SERIALIZER = 'json'
CELERY_TIMEZONE = 'Europe/Berlin'
CELERY_DEFAULT_QUEUE = 'red'
CELERY_TASK_QUEUES = (
    Queue('red', Exchange('red'), routing_key='red'),
)
CELERY_ROUTES = {
    'api.tasks.manually_task': {'queue': 'red'},
}

我的 celery.py 看起来像这样:

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django-project.settings')

app = Celery('django-project')

app.config_from_object('django.conf:settings', namespace='CELERY')

app.autodiscover_tasks()

这是我的设置。现在我开始所有需要的东西(自己终端中的每一行):

redis-server
celery -A django-project worker -Q red
python3 manage.py runserver 0.0.0.0:8000

一切开始都没有问题。在视图中,我这样称呼任务: manually_task.delay(webseite.pk)

但是在工人中什么都做不了。 如果我在settings.py 中没有CELERY_TASK_QUEUESCELERY_DEFAULT_QUEUECELERY_ROUTES 设置的情况下尝试此操作,并使用celery -A django-project worker 正常启动工作程序,它工作正常。 我做错了什么?

【问题讨论】:

    标签: django redis celery django-celery django-redis


    【解决方案1】:

    manually_task.delay(webseite.pk) 会将任务发送到默认队列。由于您的工作人员订阅了red 队列,我假设没有工作人员订阅了默认队列,因此该任务不会被执行。

    请尝试以下操作:manually_task.apply_async(webseite.pk, queue="red")

    【讨论】:

    • 返回manually_task() got an unexpected keyword argument 'queue'
    • 我尝试启动两个工人,例如像这样:celery -A django-project worker -Q manually_task --concurrency=1celery -A django-project worker -Q firsttime_task --concurrency=1,我收到第一个启动工人的错误Probably the key ('_kombu.binding.reply.celery.pidbox') has been removed from the Redis database.. 为什么?
    • 我解决了这个问题manually_task() got an unexpected keyword argument 'queue'。 delay() 没有提供像queue 这样的参数,我使用apply_async
    • 好的,但是为什么当我使用不同的队列启动工作人员时会出现错误?
    • 您没有提到任何错误。你所说的只是任务没有被执行。如果您有其他一些工作人员订阅了不同的队列,那么您需要确保将相关任务发送到该队列。
    最近更新 更多