How do I tell celery worker to stop accepting tasks? How can I check if any celery worker tasks are running?

可紊 提交于 2019-12-18 07:12:23

问题


The scenario:

  • System running on a server consisting of a Python/Flask web application and background tasks using Celery
  • Both web application and celery workers are run as upstart jobs (Web app behind Nginx)
  • Deployment to production is done with a script that:

    • Stop the upstart jobs
    • Push code to server
    • Run any db migrations
    • Start the upstart jobs

How can I enhance the deployment script so it does the following?:

  • Tell the celery worker to stop accepting tasks
  • Wait until any currently running celery tasks are finished
  • Stop the upstart jobs
  • Push code to server
  • Run any db migrations
  • Start the upstart jobs

回答1:


The following script, run as part of the deployment solved the problem:

import time
from celery.app.control import Control
from myapp.tasks import celery # my application's Celery app

if __name__ == "__main__":
    control = Control(celery)
    control.cancel_consumer("celery") # queue name, must probably be specified once per queue, but my app uses a single queue

    inspect = control.inspect()
    while True:
        active = inspect.active()
        running_jobs = []
        for key, value in active.items():
            running_jobs.extend(value)
        if len(running_jobs) > 0:
            print("{} jobs running: {}".format(len(running_jobs), ", ".join(job["name"] for job in running_jobs)))
            time.sleep(10)
        else:
            print("No running jobs")
            break


来源:https://stackoverflow.com/questions/27982769/how-do-i-tell-celery-worker-to-stop-accepting-tasks-how-can-i-check-if-any-cele

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!