我目前正在尝试对计划的芹菜任务每分钟进行一次定期检查。如果任务仍在运行,则让其继续运行而不中断它,但如果该任务不再运行,则激活该任务并开始运行它。但是目前,我无法让脚本仅在不再运行时才能运行。我尝试了两种方法来执行此操作,但是我的脚本未检测到现有的正在运行的脚本,即使它不应该运行并且我的任务开始同时运行,它也开始运行。我正在使用celery 4.2.0和Django 1.11.6。关于如何解决此问题的任何提示?谢谢
@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秒运行一次(如果尚未执行)
'send_second_task': {
'task': 'send-two-task',
'schedule': 60.0,
},
答案 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应该由checkrunning [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任务的一部分,因此两次作为第二个任务包含在字典中。
让我知道是否有人有更好的答案,或者我是否可以进行修改以改善我的答案。