django - 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') 和 checkrunning[ 显示 send_two_tasks 名称0][1].get('name') 当 send_one_task 和 send_two_task 都在运行时。我认为这是因为正在运行的 send_one_task/function 被视为 send_two_task celery 任务的一部分,因此两次作为第二个任务包含在字典中。
让我知道是否有人有更好的答案,或者我是否可以进行编辑以改善我的答案。
推荐阅读
- ios - 在 Xamarin 中的 iCloud 中存储文本文件
- c - 切换二叉树子树 SIGSEV
- awk - 在 bash 脚本中使用 awk 实现 vlookup 功能
- c# - Linq Query 多个表加入不同表名的数组
- python - 错误显示:无法在 Termux 上找到包 python
- javascript - D3 - 当树加载时使链接与节点一起流动
- python - 字符串列出python转换
- tensorflow - keras 模型达到几乎 100% 的验证准确率,但预测总是返回 1
- html - 如何将一个元素放置在左右浮动的 2 个元素的底部?
- eclipse - macOS Catalina 的 Eclipse 升级