我有一个python脚本,它有一个名为produce_output(input)
的方法,用于在运行一个很难预测需要多长时间的长时间运行的进程后生成输出文件。有时进程会挂起(由于内存或输入错误)。
在同一个脚本中,我想创建一个方法has_output_changed()
,它将监视输出文件的文件大小更改,这样如果文件大小没有变化超过5分钟,我们终止方法produce_output()
并退出脚本。
我将如何实施?
produce_output(input)
是将要运行的Celery任务。我希望任务能够自我意识到它生成的输出文件大小,并在它意识到它没有做任何工作时自行终止,因为用于将输入转换为输出的进程挂起(即内存泄漏,坏输入,资源不足)。
答案 0 :(得分:1)
假设只有脚本正在写入文件,您可以简单地监视自上次向文件写入内容以来的时间:
import signal, time
# Set time limit to 5 minutes.
time_limit = 300
class TimeoutException(Exception):
pass
# Create signal countdown.
def signal_handler(signum, frame):
raise TimeoutException("Idle for too long! Exit!")
signal.signal(signal.SIGALRM, signal_handler)
signal.alarm(time_limit)
# Reset signal countdown every time to write to file.
def print_to_file(msg):
print(msg) #or other writing method.
signal.alarm(time_limit)
try:
# Do your stuff here, for example:
print_to_file('a')
time.sleep(time_limit + 1)
except TimeoutException, msg:
# Nothing happened for 5 minutes!
print msg
else:
signal.alarm(0)