我有一个关于暂停/恢复长时间运行程序的问题。我将在这个例子中使用Python,但它可以用于任何编程语言。
假设我想将所有数字总结为十亿,例如
results = []
for i in range(1000000000):
results.append(i + i*2)
with open('./sum.txt', 'w') as outfile:
for r in results:
output.write(r+'\n')
outfile.close()
这是一个非常简单的程序,最后我想将值写入文件。
假设我开始使用此脚本并且需要数小时才能关闭计算机。现在我可以等一下,但是有什么方法可以在保持数据的同时停止这个过程?
我想在循环之前和循环内部打开文件,而不是附加到结果列表,我只能将[append]写入打开的文件但是如果我退出程序,那似乎仍然是文件永远不会关闭,数据可能会被破坏。即使我只是在循环中写入文件然后在写入操作之后直接关闭文件,这是否仍然会导致数据损坏或什么?
我有什么方法可以解决这样的问题。我希望能够停止一个程序,然后重新启动程序,它可以从它停止的地方继续吗?
如果你有一个长时间运行的脚本,它可以完成循环内部的大部分工作。
@MisterMiyagi 你能说明你的实际问题是什么吗? 如果您愿意,可以在循环内创建安全点 保持循环的状态。文件I / O是否可以安全地防止损坏 不依赖于您的应用程序而非操作/文件系统。 在Linux中,写入临时文件然后重命名它是安全的; 程序退出时,文件也会自动关闭。
我对循环中的安全位置更感兴趣。在一个结构如上所述的程序中,有哪些建议的方法可以做到这一点。
答案 0 :(得分:1)
Ctrl + C不会破坏文件。我不确定您需要多么复杂,但一个简单的解决方案是能够为程序提供从哪里恢复的输入:
def main(start=0):
with open('./sum.txt', 'w') as outfile:
for i in range(start, 10000000):
outfile.write(str(i) +'\n')
if __name__ == "__main__":
import sys
try:
start = int(sys.argv[1])
except IndexError:
start = 0
main()
然后运行就像从1000继续:
python foo.py 1000
答案 1 :(得分:1)
可能的解决方案是在脚本中,定期检查是否存在“触发器”文件。在下面的示例中,循环会在一百个循环中检查一次,但您可以将其设为500个。
如果 ,只要文件存在,循环就会保持,每两秒再次检查一次。
虽然这样可以正常工作,但您必须接受这样一个事实:它会稍微减慢循环速度,具体取决于n
;较大的n会降低效果。然而,循环中的 ANY 解决方案在循环中至少会有一些效果。
虽然这是python
,但任何语言和任何操作系统都应该可以使用这个概念。
print
函数只是表明它当然有效:)
import os
import time
results = []
n = 100
for i in range(1000000000):
results.append(i + i*2)
print(i)
if i%n == 0:
while os.path.exists("test123"):
time.sleep(2)
print("wait")
else:
print("go on")
with open('./sum.txt', 'w') as outfile:
for r in results:
output.write(r+'\n')
outfile.close()
结果,如果我创建了触发器文件并再次将其删除:
4096
4097
4098
4099
wait
wait
wait
wait
wait
wait
go on
4100
4101
4102