Python 一段时间后中止循环

Python 一段时间后中止循环,python,Python,我有一个可能会运行到长循环中的代码。这些不是无限循环,但某些输入可能会导致循环持续较长时间。我希望在循环过长时使用中断。有了这个中断,循环将重新评估它的输入,所以键盘中断不是我想要的。我正在Windows上使用python 2.7 一种可能的方法是使用time.time()进行轮询,但效率极低。循环本身并不长,但即使在正常运行中,它也会迭代100k次,因此我无法轮询每次迭代后的时间,这会大大降低效率。或者,我可以引入更多变量 i=0 while i<some_very_large_numb

我有一个可能会运行到长循环中的代码。这些不是无限循环,但某些输入可能会导致循环持续较长时间。我希望在循环过长时使用中断。有了这个中断,循环将重新评估它的输入,所以键盘中断不是我想要的。我正在Windows上使用python 2.7


一种可能的方法是使用time.time()进行轮询,但效率极低。循环本身并不长,但即使在正常运行中,它也会迭代100k次,因此我无法轮询每次迭代后的时间,这会大大降低效率。或者,我可以引入更多变量

i=0
while i<some_very_large_number:
    function(foo, foo1, foo2)
    i=i+1

一种可能的方法是修改脚本,使其通过命令行参数获取输入,然后使用
subprocess
module以超时方式运行脚本:

#manager.py
导入子流程
尝试:
code=subprocess.call('python work.py 5',超时=2)
打印('以代码结尾',代码)
除subprocess.TimeoutExpired外:
打印('以超时结束')
#work.py
导入系统
从时间上导入睡眠
尝试:
wait=int(sys.argv[1])
除:
等待=10
睡眠(等待)
打印(f'等待{等待}秒')
输出:

Ended with timeout

您还可以在单独的辅助进程中执行长时间运行的代码,并在超过超时且辅助进程尚未完成时尝试终止该代码:

import time
from multiprocessing import Process


def process_data():

    while True:
        print("processing...")
        time.sleep(1)


def main():
    worker = Process(target=process_data)
    worker.start()

    timeout = 5
    time.sleep(timeout)

    if worker.is_alive():
        print("exceeded timeout", timeout, "sec")
        print("terminate worker", worker)
        worker.terminate()

    worker.join()
    print("is worker", worker, "alive:", worker.is_alive())


if __name__ == "__main__":
    main()
以下是输出:

processing...
processing...
processing...
processing...
processing...
exceeded timeout 5 sec
terminate worker <Process(Process-1, started)>
is worker <Process(Process-1, stopped[SIGTERM])> alive: False
处理。。。
处理。。。
处理。。。
处理。。。
处理。。。
超过超时5秒
解雇工人
工人还活着吗

使用时间有什么问题?是不是它会给你的代码增加比你想要的更多的运行时间?@Blackrandt谢谢你,但信号文档说它只在UNIX中可用。不是吗?我弄混了什么吗?“一种可能的方法是使用time.time()进行轮询,但效率极低。”你的确切意思是什么?如何或为什么会效率低下?这里最合理的方法似乎是将函数开始时的时间保存在变量中,并在每次迭代时测量经过的时间,如果经过的时间太长,则引发异常或其他情况。这不适合你吗?@C.Koca你在Windows平台上吗?如果是这样的话,那就很重要了,你应该把它写在原来的帖子里。@Blackrandt是的,我试图在问题中暗示它,但我会说得很清楚。
processing...
processing...
processing...
processing...
processing...
exceeded timeout 5 sec
terminate worker <Process(Process-1, started)>
is worker <Process(Process-1, stopped[SIGTERM])> alive: False