我的自动化任务在本地工作,但在我的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设置它就不会运行
答案 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
运行的哪一个芹菜工人,这肯定会造成负担。