我用Django配置了Celery。我正在寻找一种运行任务的方法,该任务预计将在运行应用程序的整个周期中执行。是我使用 Celery worker 的情况,还是有一些其他选项可以与 Django 服务器并行启动如此长时间运行的任务?
我还希望能够从任务访问数据库,并在无法重新启动的情况下与主管一起监视它。
我看到两个问题:
如何在 django 完成启动时启动芹菜任务
请参阅下面的第 2 点,但在此之前,请参阅0 和 1。
运行任务,预计在运行应用程序的整个周期中执行。
如何没有用例,我看到三种解释:
-0.如何与runserver
或uwsgi,古尼角兽,mod_wsgi等一起运行芹菜
你需要为不同的进程运行不同的命令,一个用于 Web 服务器进程,另一个用于芹菜工人,彼此链接的方式是通过代理,当代理相同时,django 向其发送任务并芹菜拉取,使用像 supervisord 这样的进程管理器来管理进程,并使用同一个代理让它们说话。
- 如何在 django 请求/响应周期中保持芹菜可用于启动任务需要。
使用 supervisored 运行 celery 任务后,并且需要在每个请求/响应上启动一个任务,请使用请求/响应信号通过相应的 celery@task
修饰器调用函数。
- 如何在提供请求/响应的主 python 进程中保持芹菜任务运行是活动的,换句话说,因为 python 守护进程开始直到它结束,例如,直到
python manage.py runserver
运行直到python manage.py runserver
终止。(这与第 #1 点不同,因为一个python manage.py runserver
负责提供 N 个请求/响应)。
这听起来像是长池化,假设您想测量应用程序运行了多长时间,因为您可能会计算从它开始到结束的秒数,通常这些情况是用其他策略处理的,例如分析应用程序日志,但无论如何如果是这种情况,您将有一个忙碌的芹菜工人一直在运行。通常这是一个可能的错误模式,但用例是用例,因此,Web 应用程序的入口点是 wsgi 文件,退出点是系统的进程SIGINT
信号,请阅读此问题。
我的意图不是混淆,是指出这个问题能够有多种解释方式,反正每种方式都有答案。
您可以按照此处所述将芹菜作为后台作业运行。同样在部署时,您必须运行两个 pod(在一个系统上 celery 将运行,在另一个 django 应用程序上运行),并且必须配置在部署任何内容后重新启动。这样,如果您的后台作业占用更多内存或任何内容,则不会影响应用程序。
为了与应用程序并行运行任务,您可以运行计划作业,该作业检查事件,例如每分钟检查一次,并在需要时执行该作业。
在你的主管中.ini
[group:yourproject-staging]
programs=yourproject-staging-uwsgi,yourproject-staging-celery
[program:yourproject-staging-uwsgi]
command=/data/www/yourproject-staging/bin/uwsgi --ini /data/www/yourproject-staging/conf/yourproject.staging.uwsgi.ini
user=www-data
autostart=true
autorestart=true
startsecs=5
priority=1100
killasgroup=true
[program:yourproject-staging-celery]
command=/data/www/yourproject-staging/bin/celery -A yourproject worker --loglevel=INFO
directory=/data/www/yourproject-staging
environment=E=staging
user=www-data
autostart=true
autorestart=true
startretries=2
exitcodes=0
stopasgroup=true
killasgroup=true
startsecs=5
priority=850
stdout_logfile=/data/log/yourproject-staging/celery_worker.log
stderr_logfile=/data/log/yourproject-staging/celery_error.log
这将在暂存环境中启动您的芹菜工人。
检查您是否安装了 Redis,因为我没有,而且我卡了几个小时。