我有一个关于暂停/恢复长时间运行的程序的问题。在这个例子中我将使用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中,写入临时文件,然后重命名它是安全的;当程序退出时,文件也会自动关闭。
我更感兴趣的是在循环中的一个安全的地方。在像上面这样的程序中,有哪些推荐的方法可以做到这一点呢?
为循环创建继续或保持的条件
一个可能的解决方案是在脚本中,定期检查"触发器";文件存在。在下面的示例中,循环每100个循环检查一次,但您可以将其设置为500。
如果
并且只要文件存在,循环将保持,每两秒再次检查一次。
虽然这工作得很好,但您必须接受这样一个事实,即它会略微减慢循环速度,具体取决于n
;较大的n会降低效果。然而,循环中的任何解决方案至少会对循环产生一些效果。
虽然这是在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
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