Django celery-检查任务是否完成,是否完成以重新启动任务(如果未完成,请不要重新启动任务)

时间:2019-07-15 14:08:31

标签: django redis django-celery

我目前正在尝试对计划的芹菜任务每分钟进行一次定期检查。如果任务仍在运行,则让其继续运行而不中断它,但如果该任务不再运行,则激活该任务并开始运行它。但是目前,我无法让脚本仅在不再运行时才能运行。我尝试了两种方法来执行此操作,但是我的脚本未检测到现有的正在运行的脚本,即使它不应该运行并且我的任务开始同时运行,它也开始运行。我正在使用celery 4.2.0和Django 1.11.6。关于如何解决此问题的任何提示?谢谢

在views.py

要运行的任务

@task(name='send-one-task')
def send_one_task():

    for i in range(1,100):
        time.sleep(1)
        print ("test1 " + str(i))

    return None

我尝试了两种方法来检查进程是否已完成并停止运行-如果不是,请不要重新运行

方法1

@task(name='send-two-task')
def send_two_task():

    # method 1
    from celery import current_task
    if current_task.request.task != "send-one-task":
        send_one_task()
    else:
        pass

    return None

方法2

@task(name='send-two-task')
def send_two_task():

    from celery.task.control import inspect
    insp = inspect()
    testactive = insp.active()
    checkrunning = list(testactive.values())

    try:
        #the script is still running - so ok.
        print (checkrunning[0][1].get("name"))
        print ("task still running - ok")
        pass

    except:
        #the task has failed so need to restart
        print ("task not running - restart task")
        send_one_task()
        pass

    return None

安排对任务的检查,以使其每60秒运行一次(如果尚未执行)

在celery.py

'send_second_task': {
    'task': 'send-two-task',
    'schedule': 60.0,
},

1 个答案:

答案 0 :(得分:0)

要执行celery任务以检查另一个celery任务是否仍在运行以及是否没有运行以启动该任务,可以通过以下脚本完成。

@task(name='send-two-task')
def send_two_task():

    from celery.task.control import inspect
    insp = inspect()
    testactive = insp.active()
    checkrunning = list(testactive.values())

    try:
        # this test will fail and exception will result if send_one_task already is not running
        test = checkrunning[0][1].get("name")
        print ("task still running - ok")
        pass

    except IndexError:

        #the task has failed so need to restart
        print ("task not running - restart task")
        send_one_task()
        pass

    return None

该脚本基本上检查它正在运行的脚本数量。并且如果它正在运行两个任务(包括checkrunning [0] [0]和checkrunning [0] [1]),则应将其保留,但是如果它仅运行一个脚本(仅checkrunning [0] [0] ]),然后应重新启动第一个脚本(send_one_task)。

令人困惑的部分是,即使send_one_task应该由ch​​eckrunning [0] [1] .get('name')表示,它仍为checkrunning [0] [0] .get('name')都显示send_two_tasks名称当send_one_task和send_two_task都在运行时,检查checkrunning [0] [1] .get('name')。我认为这是因为正在运行的send_one_task / function被视为send_two_task celery任务的一部分,因此两次作为第二个任务包含在字典中。

让我知道是否有人有更好的答案,或者我是否可以进行修改以改善我的答案。