Heroku 上未使用 Celery RabbitMQ CloudAMQP 任务队列

Posted

技术标签:

【中文标题】Heroku 上未使用 Celery RabbitMQ CloudAMQP 任务队列【英文标题】:Celery RabbitMQ CloudAMQP task queues not being consumed on Heroku 【发布时间】:2014-06-13 05:31:33 【问题描述】:

此示例适用于开发环境。在 Heroku 上,任务会排队但不会被消耗。有什么想法我可能做错了吗?

RabbitMQ 仪表板显示:

Name Parameters Policy State Ready Unacked Total 1f49ea51a56049f7a68082c6297ea080 Exp D AD HA idle 1 0 1 253eb525c95944d2b742f1f112cdc0e5 Exp D AD HA idle 1 0 1

过程文件

web: gunicorn hellodjango.wsgi --workers 1
celery: python manage.py celery worker -E --time-limit=1200 --loglevel=ERROR

设置.py

from os import environ
CELERY_RESULT_BACKEND = "amqp"
BROKER_POOL_LIMIT = 0
BROKER_URL = environ.get('CLOUDAMQP_URL', '')
CELERY_TASK_RESULT_EXPIRES = 14400

查看

from django.shortcuts import render
from django.http import HttpResponse
from proj.tasks import add_to_count
from models import SampleCount
import logging
def test_async(request):
    sc = add_to_count.delay()
    count = SampleCount.objects.all()[0].num 
    return HttpResponse("test count: %s sc: %s name: %s " %(count,sc,add_to_count.name ))

型号

from django.db import models
# Create your models here.
class SampleCount(models.Model):
    num = models.IntegerField(default=0)

Tasks.py

from __future__ import absolute_import
from celery import shared_task
from proj.models import SampleCount
from celery import task
@task(name='proj.tasks')
def add_to_count():
    try:
        sc = SampleCount.objects.get(pk=1)
    except:
        sc = SampleCount()
    sc.num = sc.num + 2
    sc.save()
    return(sc)

【问题讨论】:

【参考方案1】:

我有同样的问题,就我而言,我认为这与命名有关。在您的 procfile 中,您使用的是 manage.py 而 heroku recommend 类似:

worker: celery worker --app=tasks.app

【讨论】:

【参考方案2】:

限制 celery worker 的并发,-c 1

【讨论】:

感谢您的回复。我试过 -c 1 和 -c=1 --c 1 都没有用。

以上是关于Heroku 上未使用 Celery RabbitMQ CloudAMQP 任务队列的主要内容,如果未能解决你的问题,请参考以下文章

使用 Heroku 安装 Celery 和 Redis

如何解决 Heroku 上未初始化的常量 Rake::DSL 问题?

Heroku + Celery - 拒绝连接

Heroku/Celery:一名工人同时执行任务?

Django/Celery 和 CloudAMQP/Heroku 的连接错误

如何在 Heroku 上使用 Channels 和 Celery 部署 Django?