简体   繁体   中英

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

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM