说明 Heroku Celery 指南

Clarification of guide to Heroku Celery

我正在努力弄清楚那些糟糕的指示here

在 "Configuring a Celery app" 部分下,我不确定代码放在哪里:

import os
app.conf.update(BROKER_URL=os.environ['REDIS_URL'],
            CELERY_RESULT_BACKEND=os.environ['REDIS_URL'])

非常感谢对这些说明的任何澄清。

说明表明您应该将该代码放入 tasks.py 模块中。然而,对于多个包来说,这并不是完全可扩展的,每个包都有自己的 tasks.py 模块。我建议在与 settings.py 文件相同的目录中创建一个 celery.py 文件。

# tasks.py
import celery
app = celery.Celery('example')
app.conf.update(BROKER_URL=os.environ['REDIS_URL'],
                CELERY_RESULT_BACKEND=os.environ['REDIS_URL'])

或者您可以在 settings.py 中指定您的设置并这样配置 celery:

# settings.py
broker_url = os.environ['REDIS_URL']
result_backend = os.environ['REDIS_URL']

# celery.py
from celery import Celery
from celery.utils.collections import DictAttribute
from celery.loaders.base import BaseLoader
from django.conf import settings
from django.apps import apps

class ProjectLoader(BaseLoader):
    def read_configuration(self):
        """Load configuration from Django settings.

        This may not be needed to be honest. It's what I use in my project.
        """
        return DictAttribute(settings)

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings")
# CELERY_LOADER must be set in the environment. Setting the ``loader``
# kwarg for the app instance does _not_ do what we need it to.
os.environ.setdefault("CELERY_LOADER", "project.celery:ProjectLoader")

app = Celery("project")
app.config_from_object("django.conf:settings")
app.autodiscover_tasks(lambda: [n.name for n in apps.get_app_configs()])

# Procfile
worker: celery worker --app=project.celery

免责声明,其中一些配置需要针对您的项目进行调整。

以下是我结合说明 here 以及我在网上找到的其他资源制作 最小 heroku/django/celery/redis 项目的步骤.希望有人会觉得这很有用。

  1. 在您的终端中,使用 "heroku login" 命令登录 Heroku CLI。

  2. "git clone https://github.com/heroku/python-getting-started.git" 将基本的 django 框架项目复制到本地。

  3. 重命名 python-getting-started 为任何名称。

  4. cd 进入这个目录。

  5. 运行 以下命令:"pip install -r requirements.txt" 注意:必须正确安装 Postgres 才能使此步骤正常工作。

  6. 运行 以下命令:"python manage.py collectstatic"

  7. 在Mac上安装redis:"brew install redis"

  8. 启动redis服务器:"redis-server&"(最后的&是为了运行它作为后台进程)

  9. 测试 Redis 服务器是否 运行ning: "redis-cli ping"。如果它回复“PONG”,那么就可以开始了!

  10. 安装芹菜:"pip install celery"

  11. 使用以下代码在您的应用程序目录中创建一个 tasks.py 文件:

     from celery import Celery
    
     app = Celery('tasks', broker='redis://localhost:6379/0')
    
     @app.task
     def add(x, y):
         return x + y
    
  12. "cd .."回到根目录

  13. 运行芹菜:"celery worker -A=location of tasks&"

  14. 运行: "python manage.py shell" 在你的根目录下。

  15. 因为你的任务 celery 服务器已经启动,你现在可以使用它来 运行 你的任务,只需导入 tasks.py 脚本,例如来自 Python 解释器交互模式:

    import hello.tasks
    hello.tasks.add.delay(1, 1)
    

这应该是 return 一条异步消息。

  1. 将本地推送到 heroku master。

** 注意:如果您 运行 "celery worker -A=location of tasks.py&" 并且它给出消息:

consumer: Cannot connect to amqp://guest:**@127.0.0.1:5672//: [Errno 61]           
Connection refused.

尝试使用以下命令重新启动 redis 服务器:"brew services restart redis"


给你。一个最小的 heroku/django/celery/redis 项目!可以下载here.Instructions on how to deploy this to heroku.

** 注意:在工作项目中,"celery worker" 命令已包含在 Procfile 中。