gpt4 book ai didi

python - 特定于队列的 Celery 事件

转载 作者:IT王子 更新时间:2023-10-29 06:01:37 26 4
gpt4 key购买 nike

我有两个 Django 项目,每个项目都有一个 Celery 应用程序:

- fooproj.celery_app
- barproj.celery_app

每个应用都在运行自己的 Celery worker:

celery worker -A fooproj.celery_app -l info -E -Q foo_queue
celery worker -A barproj.celery_app -l info -E -Q bar_queue

以下是我配置 Celery 应用程序的方式:

import os
from celery import Celery
from django.conf import settings


# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings.local')


app = Celery('celery_app', broker=settings.BROKER_URL)
app.conf.update(
CELERY_ACCEPT_CONTENT=['json'],
CELERY_TASK_SERIALIZER='json',
CELERY_RESULT_SERIALIZER='json',
CELERY_RESULT_BACKEND='djcelery.backends.database:DatabaseBackend',
CELERY_SEND_EVENTS=True,
CELERY_DEFAULT_QUEUE=settings.CELERY_DEFAULT_QUEUE,
CELERY_DEFAULT_EXCHANGE=settings.CELERY_DEFAULT_EXCHANGE,
CELERY_DEFAULT_ROUTING_KEY=settings.CELERY_DEFAULT_ROUTING_KEY,
CELERY_DEFAULT_EXCHANGE_TYPE='direct',
CELERY_ROUTES = ('proj.celeryrouters.MainRouter', ),
CELERY_IMPORTS=(
'apps.qux.tasks',
'apps.lorem.tasks',
'apps.ipsum.tasks',
'apps.sit.tasks'
),
)

我的路由器类:

from django.conf import settings


class MainRouter(object):
"""
Routes Celery tasks to a proper exchange and queue
"""
def route_for_task(self, task, args=None, kwargs=None):
return {
'exchange': settings.CELERY_DEFAULT_EXCHANGE,
'exchange_type': 'direct',
'queue': settings.CELERY_DEFAULT_QUEUE,
'routing_key': settings.CELERY_DEFAULT_ROUTING_KEY,
}

fooproj 有设置:

BROKER_URL = redis://localhost:6379/0
CELERY_DEFAULT_EXCHANGE = 'foo_exchange'
CELERY_DEFAULT_QUEUE = 'foo_queue'
CELERY_DEFAULT_ROUTING_KEY = 'foo_routing_key'

barproj 有设置:

BROKER_URL = redis://localhost:6379/1
CELERY_DEFAULT_EXCHANGE = 'foo_exchange'
CELERY_DEFAULT_QUEUE = 'foo_queue'
CELERY_DEFAULT_ROUTING_KEY = 'foo_routing_key'

如您所见,这两个项目都使用自己的 Redis 数据库作为代理,使用自己的 MySQL 数据库作为结果后端,使用自己的交换器、队列和路由键。

我正在尝试运行两个 Celery 事件进程,每个应用程序一个:

celery events -A fooproj.celery_app -l info -c djcelery.snapshot.Camera
celery events -A barproj.celery_app -l info -c djcelery.snapshot.Camera

问题是,两个 celery 事件进程都从我所有的 Celery worker 那里接任务!所以在 fooproj 数据库中,我可以看到来自 barproj 数据库的任务结果。

知道如何解决这个问题吗?

最佳答案

来自 http://celery.readthedocs.org/en/latest/getting-started/brokers/redis.html :

Monitoring events (as used by flower and other tools) are global and is not affected by the virtual host setting.

This is caused by a limitation in Redis. The Redis PUB/SUB channels are global and not affected by the database number.

这似乎是 Redis 的警告之一:(

关于python - 特定于队列的 Celery 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25807340/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com