我怎么能暂停一个长循环运行



我有一个关于暂停/恢复长时间运行的程序的问题。在这个例子中我将使用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

相关内容

  • 没有找到相关文章