Find out whether celery task exists

后端 未结 6 427
离开以前
离开以前 2020-12-13 12:55

Is it possible to find out whether a task with a certain task id exists? When I try to get the status, I will always get pending.

>>> AsyncResult(\'         


        
6条回答
  •  鱼传尺愫
    2020-12-13 13:11

    Celery does not write a state when the task is sent, this is partly an optimization (see http://docs.celeryproject.org/en/latest/userguide/tasks.html#state).

    If you really need it, it's simple to add:

    from celery import current_app
    # `after_task_publish` is available in celery 3.1+
    # for older versions use the deprecated `task_sent` signal
    from celery.signals import after_task_publish
    
    # when using celery versions older than 4.0, use body instead of headers
    
    @after_task_publish.connect
    def update_sent_state(sender=None, headers=None, **kwargs):
        # the task may not exist if sent using `send_task` which
        # sends tasks by name, so fall back to the default result backend
        # if that is the case.
        task = current_app.tasks.get(sender)
        backend = task.backend if task else current_app.backend
    
        backend.store_result(headers['id'], None, "SENT")
    

    Then you can test for the PENDING state to detect that a task has not (seemingly) been sent:

    >>> result.state != "PENDING"
    

提交回复
热议问题