【问题标题】:Celery/Django worker detect when there are no jobs leftCelery/Django 工作人员检测何时没有工作
【发布时间】:2021-09-08 15:54:13
【问题描述】:

我有一个 Celery/Django worker 通过 RabbitMQ 连接到服务器。当工作人员完成一项工作时,如果没有剩余工作,我希望它终止 - 我如何检查队列中是否没有剩余工作?

【问题讨论】:

    标签: python django celery


    【解决方案1】:

    任务完成时杀死 pid throw psutil.

    例如:

    import psutil
    import os
    
    @celery.task
    def my_task():
        pid=os.getpid() # get the worker pid
        # your code
        return pid # or store it somewhere
    
    def task_caller()
        result = my_task.apply()
        if no_more_jobs('my_queue'): 
            kill_worker(result)
        
    def kill_worker(pid):
        try:
            proc = psutil.Process(pid=pid)
            for child in proc.children(recursive=True):
                child.kill()
            proc.kill()
            return True
        except Exception:
            # manage exception
            return False
    
    def no_more_jobs(queue):
        # edit below params
        connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
        channel = connection.channel()
        q = channel.queue_declare(queue)
        return q.method.message_count == 0
    

    注意:这是一个基本示例,需要根据您的生产者/消费者逻辑进行编辑

    【讨论】:

    • 谢谢,但实际上我需要帮助的是 no_more_jobs() 调用
    • 已编辑答案。有一些代码会很有用
    猜你喜欢
    • 2021-08-15
    • 2021-08-18
    • 1970-01-01
    • 2020-02-05
    • 2020-01-28
    • 2017-08-19
    • 2015-07-04
    • 2021-12-12
    • 2014-12-06
    相关资源
    最近更新 更多