如何暂停一个长 运行 循环?
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
我对暂停/恢复较长的 运行 程序有疑问。我将在此示例中使用 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.
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