【问题标题】:How to start Celery task when Django finished startupDjango完成启动时如何启动Celery任务
【发布时间】:2018-10-30 06:10:46
【问题描述】:

我用 Django 配置了 Celery。而且我正在寻找一种运行任务的方法,该任务预计将在运行应用程序的整个周期内执行。这是我使用 Celery worker 的情况,还是有其他一些选项可以与 Django 服务器并行启动如此长时间运行的任务?

我还希望能够从任务访问数据库并使用 supervisord 监控它,以防它无法重新启动它。

【问题讨论】:

标签: django celery


【解决方案1】:

我看到两个问题:

django启动完成后如何启动celery任务

请参阅下面的第 2 点,但之前请参阅第 0 点和第 1 点。

运行预期在整个应用程序运行周期内执行的任务。

怎么没有用例,我看到三种解释:

-0。如何与runserver或uwsgi、gunicorn、mod_wsgi等一起运行celery

你需要为不同的进程运行不同的命令,一个用于 web 服务器进程,另一个用于 celery worker,相互链接的方式是通过代理,当代理相同时,django 会向它发送一个任务并celery pulls,使用像 supervisord 这样的流程管理器来管理流程,并使用同一个代理来让它们说话。

  1. 如何在 django 请求/响应周期要求期间保持 celery 可用于启动任务。

使用 supervisord 运行 celery 任务后,您需要在每个请求/响应上启动一个任务,使用 Request/response signals 使用相应的 celery @task 装饰器调用该函数。

  1. 如何在提供请求/响应的主要 python 进程期间保持 celery 任务处于活动状态,换句话说,因为 python 守护程序开始直到结束,例如,直到 python manage.py runserver 运行直到 python manage.py runserver被终止。 (这与第 1 点不同,因为 python manage.py runserver 负责处理 N 个请求/响应)。

在我看来,这听起来像是长池化,假设您想测量应用程序运行了多长时间,因为您可能会计算从它开始到结束的秒数,通常这些情况是通过其他策略来处理的,例如分析应用程序日志,但无论如何,如果是这种情况,您将一直有一个忙碌的芹菜工人在运行。通常这可能是错误的模式,但用例就是用例,因此,Web 应用程序的入口点是 wsgi 文件,出口点是系统进程SIGINT 信号、read this question

我的意图不是混淆,而是指出这个问题可以有多种解释方式,无论如何,每个人都有一个答案。

【讨论】:

    【解决方案2】:

    您可以按照here 的描述将 celery 作为后台作业运行。此外,在部署时,您必须运行两个 pod(在一个系统上运行 celery,在另一个 django 应用程序上运行),并且必须将其配置为在部署任何内容后重新启动。这样,如果您的后台作业占用了更多内存或其他任何不应该影响应用程序的东西。

    为了与您的应用程序并行运行任务,您可以运行计划作业来检查事件,例如每分钟检查一次,并在需要时执行该作业。

    【讨论】:

      【解决方案3】:

      在您的 supervisord.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
      

      这将在暂存环境中启动您的 celery worker。

      不过,请检查您是否安装了 Redis,因为我没有安装,而且我卡了几个小时。

      【讨论】:

        最近更新 更多