celery shutdown worker after particular task

后端 未结 3 2022
遥遥无期
遥遥无期 2021-02-07 00:25

I\'m using celery (solo pool with concurrency=1) and I want to be able to shut down the worker after a particular task has run. A caveat is that I want to avoid any possibility

3条回答
  •  清酒与你
    2021-02-07 00:33

    If you shutdown the worker, after the task has completed, it won't re-queue again.

    @task_postrun.connect(sender=add)
    def shutdown(*args, **kwargs):
        app.control.broadcast('shutdown')
    

    This will gracefully shutdown the worker after tasks is completed.

    [2018-04-01 18:44:14,627: INFO/MainProcess] Connected to redis://localhost:6379/0
    [2018-04-01 18:44:14,656: INFO/MainProcess] mingle: searching for neighbors
    [2018-04-01 18:44:15,719: INFO/MainProcess] mingle: all alone
    [2018-04-01 18:44:15,742: INFO/MainProcess] celery@foo ready.
    [2018-04-01 18:46:28,572: INFO/MainProcess] Received task: celery_worker_stop.add[ac8a65ff-5aad-41a6-a2d6-a659d021fb9b]
    [2018-04-01 18:46:28,585: INFO/ForkPoolWorker-4] Task celery_worker_stop.add[ac8a65ff-5aad-41a6-a2d6-a659d021fb9b] succeeded in 0.005628278013318777s: 3   
    [2018-04-01 18:46:28,665: WARNING/MainProcess] Got shutdown from remote
    

    Note: broadcast will shutdown all workers. If you want to shutdonw a specific worker, start worker with a name

    celery -A celeryapp  worker -n self_killing --concurrency=1 --pool=solo
    

    Now you can shutdown this with destination parameter.

    app.control.broadcast('shutdown', destination=['celery@self_killing'])
    

提交回复
热议问题