Python 如何暂停长时间运行的循环?

Python 如何暂停长时间运行的循环?,python,loops,for-loop,long-running-processes,pause,Python,Loops,For Loop,Long Running Processes,Pause,我有一个关于暂停/恢复长时间运行的程序的问题。在本例中,我将使用Python,但它实际上可以用于任何编程语言 比如说,我想把所有的数字加起来10亿 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(

我有一个关于暂停/恢复长时间运行的程序的问题。在本例中,我将使用Python,但它实际上可以用于任何编程语言

比如说,我想把所有的数字加起来10亿

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],但如果我退出程序,文件似乎仍然不会关闭,数据可能会损坏。即使我只是在循环中写入文件,然后在写入操作后直接关闭文件,这是否仍然会导致数据损坏或其他问题

我可以用什么方法来解决这样的问题。我想在哪里停止一个程序,然后重新启动程序,然后从停止的地方继续

如果您有一个长时间运行的脚本,它完成了循环内部的大部分工作

@米斯特米雅吉
你能具体说明你的实际问题是什么吗? 如果您愿意,在循环内创建安全点是一种方法 保留循环的状态。文件I/O是否安全防止损坏 与其说依赖于应用程序,不如说依赖于操作系统/文件系统。 在Linux中,可以安全地写入临时文件,然后重命名它; 当程序退出时,文件也会自动关闭


我更感兴趣的是环路内的一个安全的地方。在类似上述结构的程序中,有哪些推荐方法可以做到这一点。

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

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
创建循环继续或保持的条件 一个可能的解决方案是在脚本中,定期检查是否存在“触发器”文件。在下面的示例中,循环每一百个周期检查一次,但您可以将其设置为500

如果并且只要文件存在,循环将保持,每两秒钟再次检查一次
虽然这很好,但您必须接受这样一个事实,即它会稍微减慢循环,具体取决于
n
;n越大,影响越小。然而,循环中的任何解决方案都至少会对循环产生一些影响

尽管这是在python上实现的,但是这个概念在任何语言和操作系统上都是可能的

print
功能仅用于显示它的工作原理:)

编辑的循环: 结果是,如果我创建触发器文件并再次删除它:

4096
4097
4098
4099
wait
wait
wait
wait
wait
wait
go on
4100
4101
4102
创建循环继续或保持的条件 一个可能的解决方案是在脚本中,定期检查是否存在“触发器”文件。在下面的示例中,循环每一百个周期检查一次,但您可以将其设置为500

如果并且只要文件存在,循环将保持,每两秒钟再次检查一次
虽然这很好,但您必须接受这样一个事实,即它会稍微减慢循环,具体取决于
n
;n越大,影响越小。然而,循环中的任何解决方案都至少会对循环产生一些影响

尽管这是在python上实现的,但是这个概念在任何语言和操作系统上都是可能的

print
功能仅用于显示它的工作原理:)

编辑的循环: 结果是,如果我创建触发器文件并再次删除它:

4096
4097
4098
4099
wait
wait
wait
wait
wait
wait
go on
4100
4101
4102

使用您的硬件/操作系统执行此操作、休眠或将整个过程放入虚拟机并保存机器状态,而不是将其关闭。我一直在考虑将循环放入
try
块中,然后
除了键盘中断:outfile.close()
这样,如果在循环过程中强制关闭程序,数据将保持完整。然而,“从你停止的地方开始”的想法让我难以置信!查看
with
语句。您可以将代码更改为写入总和以及作为逗号分隔值添加的最后一个数字。然后更改代码,使其检查最后添加的数字并从那里继续,或者如果该字段为空,则从0开始。请指定实际问题是什么?如果要保留循环的状态,在循环内创建安全点是一种方法。文件I/O是否安全防止损坏与其说取决于应用程序,不如说取决于操作/文件系统。在Linux中,可以安全地写入临时文件,然后重命名它;当程序退出时,文件也会自动关闭。使用您的硬件/操作系统执行此操作、休眠或将整个过程放入虚拟机并保存机器状态,而不是将其关闭。我一直在考虑将循环放入
try
块中,然后
除了键盘中断:outfile.close()
这样,如果在循环过程中强制关闭程序,数据将保持完整。然而,“从你停止的地方开始”的想法让我难以置信!查看
with
语句。您可以将代码更改为写入总和以及作为逗号分隔值添加的最后一个数字。然后更改代码,使其检查最后添加的数字并从那里继续,或者如果该字段为空,则从0开始。Ca