我正在编写一个Django应用程序,它使用管理命令从各种来源提取数据。计划是每小时用cron运行这个命令,并从视图中运行用户命令(即当他们添加需要数据的新项目时,我不希望他们等待下一个小时滚动到看结果)。问题是:
如何设置此命令,使其如果当前已在运行,则不会执行?在某些地方我可以存储一个可以在执行之前由脚本检查的变量吗?我目前最好的想法是让命令监视stdout一段时间,以确保没有其他任何正在执行,但这似乎是一个充其量的黑客。这是将在后台运行的唯一任务。
我基本上都试图避免在这里使用Celery。
答案 0 :(得分:1)
将read函数包装在try / except块中,标记一些外部memoization以执行控制。我以Redis为例:
from redis import Redis
try:
r_client = Redis() # assuming standard settings
sentinel = r_client.incr("my_sentinel")
if sentinel == 1:
run_command()
else:
r_client.decr("my_sentinel")
except Exception as e:
r_client.decr("my_sentinel")
raise e
答案 1 :(得分:0)
你可以创建一个名为" i_am_running.log"的文件。在管理命令的开头,如果它在最后删除它。运行相同的管理命令时,请检查其“'存在。如果不存在 - 进一步。否则 - 中止。