如何暂停一个长 运行 循环?

How can I pause a long running loop?

我对暂停/恢复较长的 运行 程序有疑问。我将在此示例中使用 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 Can you please specify what your actual question is? Creating safe-points inside the loop is the way to go if you want to preserve the loop's state. Whether file I/O is safe against corruption doesn't depend on your application so much as operating/file system. In Linux, it's safe to write to a temporary file, then rename it; files are also closed automatically when a program exits.

我对循环内的安全位置更感兴趣。在结构类似于上面的程序中,有哪些推荐的方法可以做到这一点。

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

为循环创建继续或保持的条件

一个 pos 可行的解决方案将在脚本中,定期检查是否存在“触发器”文件。在下面的示例中,循环每百个周期检查一次,但您可以将其设为 500。

If 并且只要文件存在,循环就会保持,每两秒再次检查一次。
虽然这工作正常,但您将不得不接受这样一个事实,即它会稍微减慢循环速度,具体取决于 n;较大的 n 会降低效果。 循环内的任何解决方案将至少对循环产生一些影响。

虽然这是在 python 上,但这个概念在任何语言和任何 os.

上都应该是可行的os

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