Django celery - 检查任务是否完成,如果完成则重启任务(如果没有完成,不要重启任务)
Django celery - to check if a task is complete, if complete to restart the task (if not complete, do not restart the task)
我目前正在尝试 运行 每分钟定期检查计划的芹菜任务。如果任务还在运行ning,让它继续运行ning而不打断它,但是如果任务已经不再运行ning,就激活任务并开始运行宁它。但是目前,只有当它不再是 运行ning 时,我才能将脚本获取到 运行。我尝试了两种方法,但我的脚本没有检测到现有的 运行ning 脚本,它开始 运行,即使它不应该,我的任务同时开始 运行。我正在使用 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
我已经尝试了两种方法来检查进程是否已完成并停止 运行ning - 如果没有,请不要重新运行它
方法一
@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
脚本基本上检查它有多少个脚本运行。而如果是运行两个任务(包括check运行[0][0]和check运行[0][1]),应该不管它,但是如果它只有 运行 个脚本(只检查 运行[0][0])然后它应该重新启动第一个脚本(send_one_task)。
令人困惑的部分是,即使 send_one_task 应该由 check运行[0][1].get('name') 表示,它显示 send_two_tasks 名称对于 check运行[0][0].get('name') 和 check运行[0][1].get('name') 当两个 send_one_task 和 send_two_task 是 运行。我认为这是因为 send_one_task/function 即 运行 被算作 send_two_task celery 任务的一部分,因此作为第二个任务两次包含在字典中。
让我知道是否有人有更好的答案,或者我是否可以进行编辑以改善我的答案。
我目前正在尝试 运行 每分钟定期检查计划的芹菜任务。如果任务还在运行ning,让它继续运行ning而不打断它,但是如果任务已经不再运行ning,就激活任务并开始运行宁它。但是目前,只有当它不再是 运行ning 时,我才能将脚本获取到 运行。我尝试了两种方法,但我的脚本没有检测到现有的 运行ning 脚本,它开始 运行,即使它不应该,我的任务同时开始 运行。我正在使用 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
我已经尝试了两种方法来检查进程是否已完成并停止 运行ning - 如果没有,请不要重新运行它
方法一
@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
脚本基本上检查它有多少个脚本运行。而如果是运行两个任务(包括check运行[0][0]和check运行[0][1]),应该不管它,但是如果它只有 运行 个脚本(只检查 运行[0][0])然后它应该重新启动第一个脚本(send_one_task)。
令人困惑的部分是,即使 send_one_task 应该由 check运行[0][1].get('name') 表示,它显示 send_two_tasks 名称对于 check运行[0][0].get('name') 和 check运行[0][1].get('name') 当两个 send_one_task 和 send_two_task 是 运行。我认为这是因为 send_one_task/function 即 运行 被算作 send_two_task celery 任务的一部分,因此作为第二个任务两次包含在字典中。
让我知道是否有人有更好的答案,或者我是否可以进行编辑以改善我的答案。