Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多个Django项目无意中相互接收';西芹的任务_Django_Rabbitmq_Celery - Fatal编程技术网

多个Django项目无意中相互接收';西芹的任务

多个Django项目无意中相互接收';西芹的任务,django,rabbitmq,celery,Django,Rabbitmq,Celery,我有五个不同的Django项目,它们都运行在一个盒子上,安装了一个RabbitMQ。我用芹菜做各种各样的工作。每个项目似乎都在接收其他项目的任务 每个代码库都有自己的虚拟环境,其中运行以下内容: ./manage.py celeryd --concurrency=2 --queues=high_priority 每个settings.py中的参数如下所示: CELERY_SEND_EVENTS = True CELERY_TASK_RESULT_EXPIRES = 10 CELERY_RESU

我有五个不同的Django项目,它们都运行在一个盒子上,安装了一个RabbitMQ。我用芹菜做各种各样的工作。每个项目似乎都在接收其他项目的任务

每个代码库都有自己的虚拟环境,其中运行以下内容:

./manage.py celeryd --concurrency=2 --queues=high_priority
每个settings.py中的参数如下所示:

CELERY_SEND_EVENTS = True
CELERY_TASK_RESULT_EXPIRES = 10
CELERY_RESULT_BACKEND = 'amqp'
CELERYBEAT_SCHEDULER = "djcelery.schedulers.DatabaseScheduler"
CELERY_TIMEZONE = 'UTC'
BROKER_URL = 'amqp://guest@127.0.0.1:5672//'
BROKER_VHOST = 'specific_app_name'
我看到的回溯让我觉得应用程序在接收彼此的消息,而它们本不应该这样:

Traceback (most recent call last):
  File "/home/.../.virtualenvs/.../local/lib/python2.7/site-packages/kombu/messaging.py", line 556, in _receive_callback
    decoded = None if on_m else message.decode()
  File "/home/.../.virtualenvs/.../local/lib/python2.7/site-packages/kombu/transport/base.py", line 147, in decode
    self.content_encoding, accept=self.accept)
  File "/home/.../.virtualenvs/.../local/lib/python2.7/site-packages/kombu/serialization.py", line 187, in decode
    return decode(data)
  File "/home/.../.virtualenvs/.../local/lib/python2.7/site-packages/kombu/serialization.py", line 74, in pickle_loads
    return load(BytesIO(s))
ImportError: No module named emails.models
在本例中,
emails.models
模块出现在一个项目中,但其他项目中没有。然而,其他人正在展示这种追溯


我没有看过多个节点名或类似的东西。这样做可以解决此问题吗?

您应该为每个项目指定不同的队列设置。例如:

CELERY_QUEUES = {
    "celery": {
        "exchange": "project1_celery",
        "binding_key": "project1_celery"},
}
CELERY_DEFAULT_QUEUE = "celery"
对于第二个项目,您将交换和绑定密钥指定为
project2\u芹菜
,依此类推


我发布的代码是针对芹菜的,因为多个django项目共享同一个框,您需要为每个项目显式地“namespace”@tasks。错误消息返回了一个名称空间“emails.models”,它不是任何一个项目所独有的

例如,如果一个项目名为“project1”,另一个项目名为“project2”,只需将“name=”参数添加到@task decorators:

# project1
# emails.py
@tasks(name=project1.emails.my_email_function, queue=high_priority)
def my_email_function(user_id):
    return [x of x in user_id if spam()]

# project2
# tasks.py
@tasks(name=project2.tasks.my_task_function, queue=high_priority)
def my_task_function(user_id):
    return [x of x in user_id if blahblah()]

celeryconfig.py
中的AMQP设置错误。您正在使用:

BROKER_URL = 'amqp://guest@127.0.0.1:5672//'
BROKER_VHOST = 'specific_app_name'
BROKER\u VHOST
参数被忽略,因为存在
BROKER\u URL
(也不推荐使用)。如果您想使用virtualhosts(顺便说一句,这是解决您提出的问题的首选方法),您应该为每个应用程序创建一个virtualhost,并在每个应用程序设置中使用以下内容:

BROKER_URL = 'amqp://guest@127.0.0.1:5672//specific_app_name'

编辑:修复缺失/

谢谢。我给每个类中的每个队列属性命名,这些类使用app name前缀扩展任务,并为每个启动的celeryd实例添加一个唯一的节点名,现在它工作得很好。
BROKER_URL = 'amqp://guest@127.0.0.1:5672//specific_app_name'