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

时间:2016-09-18 20:18:52

标签: python django heroku task crontab

我的自动化任务在本地工作,但在我的django应用程序中没有重新同步。我正在看一个教程,那个人说要阻止我的工作人员。但在我这样做之前,我把我的应用程序置于维护模式,这是行不通的。然后我跑了

heroku ps:restart

没用,然后我跑了

heroku ps:stop worker

哪次出场

 Warning: The dynos in your dyno formation will be automatically restarted.
然后我跑了

heroku ps:scale worker=1

仍然没有。我提醒那些正在读它的人,它在当地工作。我错过了什么?

我的proc文件

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

在研究时,我看到了对proc文件添加节拍的提及。事实上提到了2,但我在观看的教程中没有讨论过这个问题。只有当我把它添加到settings.py文件

时才提到芹菜节拍
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'

以防它有所作为我正在使用djcelery gui设置周期性任务,而不是在settings.py中配置sceduler,就像我在大多数示例中看到的那样。

如果我在我的视图中运行任务并调用它,它就可以了。但是如果我使用djcelery设置它就不会运行

2 个答案:

答案 0 :(得分:0)

我阅读了文档并意识到我必须添加到我的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

并在我的管理员中创建了一个计划,但它确实有效。我在控制台中看到了输出。希望这可以帮助。注意它表示不建议生产不确定原因,但如果你知道或发现让我知道

答案 1 :(得分:0)

正如您在文档中所读到的那样,建议不要使用 -B 选项进行生产,您最好将celery-beat作为不同的流程运行。

所以在服务器中运行它是最佳做法,如:

celery beat -A messaging_router --loglevel=INFO

如果您使用supervisor来保持流程正常运行,则需要在配置文件中添加以下内容。

[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",

原因是文档说

  

你也可以通过启用worker -B选项来开始在worker中嵌入beat,如果你永远不会运行多个worker节点,这很方便,但它并不常用,因此不建议用于生产:< / p>

考虑到你有超过1名工人,在维护方面,你需要总是改变你使用-B运行的哪一个芹菜工人,这肯定会造成负担。