我的 djcelery 任务 运行 在本地而不是远程?

My djcelery tasks run locally but not remotely?

我有自动任务在本地工作,但在我的 Django 应用程序中没有远程工作。我正在看一个教程,那个人说要阻止我的工人。但在我这样做之前,我将我的应用程序置于维护模式,但没有用。那我运行

heroku ps:restart

那没用,那我运行

heroku ps:stop worker

输出

 Warning: The dynos in your dyno formation will be automatically restarted.

那我运行

heroku ps:scale worker=1

仍然一无所获。我提醒那些正在阅读这篇文章的人,它在当地有效。我错过了什么?

我的过程文件

web: gunicorn gettingstarted.wsgi --log-file -
worker: celery worker -A blog -l info.

在研究过程中,我看到有人提到将节拍添加到 procfile。 2 实际上提到了,但这在我观看的教程中没有讨论。只有一次 celery beat 被提到是当我将它添加到 settings.py 文件时

CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'

为了以防万一,我使用 djcelery gui 设置周期性任务,而不是像我在大多数示例中看到的那样在 settings.py 中配置调度程序。

如果我 运行 任务在我看来并调用它,它就会工作。但如果我使用 djcelery

设置它,它不会 运行

我阅读了文档并意识到我必须添加到我的 worker procfile

-B

现在看起来像这样

celery -A proj worker -B -l info

在我做出改变后,我做了这个

heroku ps:scale worker=0

然后

git add .
git commit -am 'added -B'
git push heroku master

然后我

heroku ps:scale worker=1

然后我可以看到 heroku 的输出

heroku logs -t -p worker

并在我的管理员中创建了一个时间表并且它有效。我在控制台中看到了输出。希望这可以帮助。注意它说它不推荐用于生产不知道为什么但是如果你知道或发现让我知道

正如您在文档中所读到的,不建议将 -B 选项用于生产用途,您最好 运行 celery-beat作为一个不同的过程。

因此,最好在服务器中 运行 它,例如:

celery beat -A messaging_router --loglevel=INFO

如果您使用 supervisor 来保持进程 运行ning,您需要在配置文件中添加如下内容。

[program:api_beat]
command=/path/to/v_envs/v_env/bin/celery -A project beat --loglevel=info
autostart=true
autorestart=true
user=your_user (echo $USER)
directory=/path/to/project/root
stdout_logfile=/var/log/supervisor/beat.log
stderr_logfile=/var/log/supervisor/beat.log
redirect_stderr=true
environment=EVN_VAR1="whatever",

原因如文档所述

You can also start embed beat inside the worker by enabling workers -B option, this is convenient if you will never run more than one worker node, but it’s not commonly used and for that reason is not recommended for production use:

考虑到您有超过 1 个工人,在维护过程中,您需要始终改变 运行 和 -B 中的哪个 celery 工人,这绝对是负担.