Django celery - 检查任务是否完成,如果完成则重启任务(如果没有完成,不要重启任务)

标签 django redis django-celery

我目前正在尝试每分钟对计划的 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

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

方法一

@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

方法二

@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,
},

最佳答案

要执行 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 应该由 checkrunning[0][1].get('name') 表示,它也会为 checkrunning[0][0].get('name') 显示 send_two_tasks 名称和 checkrunning[0][1].get('name') 当 send_one_task 和 send_two_task 都在运行时。我认为这是因为正在运行的 send_one_task/函数被计为 send_two_task celery 任务的一部分,因此作为第二个任务两次包含在字典中。

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

关于Django celery - 检查任务是否完成,如果完成则重启任务(如果没有完成,不要重启任务),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57041535/

相关文章:

python - Windows 上的 Celery + Django : debugging asynchronous tasks

python - Django 用于什么目的?

ruby-on-rails - 为什么在 worker 运行时Resque显示 “0 out of 0 Workers Working”?没有工作被捡起

javascript - 是否有任何选项可以让我们检查 AJAX 请求的来源

python - Redis:如何解析列表结果

Redis Booksleeve,临时设置

django - 是否可以显示 django celery 任务的进度条?

python - Django TimeLimitExceeded 错误

python - Apache 子进程在分配一个巨大的 block 后不释放内存

python - 为什么 django 中 postgres 数据库连接的 connection.timezone 为 None ?