为了账号安全,请及时绑定邮箱和手机立即绑定

在原地停止长时间运行,而不让它运行到最后

在原地停止长时间运行,而不让它运行到最后

海绵宝宝撒 2022-12-06 15:06:26
所以我想弄清楚这个问题和所有其他问题之间的区别是什么:我想打破一个长时间的函数,它是这样开始的:while running:    framerate += 1.0    if Counter > 0.0:但我不想只用running=False它来停止它,因为那样已经触发的最后一个 while 循环仍然会完成并运行到最后。我需要它来微调帧速率,因此循环必须在 while 循环中的位置停止并从头开始重新启动。而且由于 while 循环真的很长,我真的不想添加if running==False:       break到 while 循环中的每个表达式。有什么办法可以在不添加数十个 break 表达式的情况下立即退出 while 循环吗?
查看完整描述

4 回答

?
倚天杖

TA贡献1828条经验 获得超3个赞

从我们在评论中的讨论来看,我相信您想从基于循环外的独立计时器的循环中跳出。


此外,您不想确定循环内的中断/返回条件(在循环代码中的几个位置)并立即中断/返回,或者通过设置一个被检查为循环条件的标志。


用户当心:终止进程或线程需要仔细检查留下的任何残骸(打开的连接、占用的资源、阻塞/锁定等...)。在这种情况下,我不知道有什么,所以 - 至少对于初学者来说 - 应该这样做:


import multiprocessing as m

import time


def looper():

  i = 0

  while True:

    print "a) i="+str(i)

    time.sleep(4)

    print "b) i="+str(i)

    time.sleep(4)

    i += 1


p = m.Process(target=looper)

p.daemon = True


print "starting"

p.start()

time.sleep(9)

p.terminate()


print "done"

输出:


starting

a) i=0

b) i=0

a) i=1

done

如果运行它,请注意需要 9 秒才能获得此输出。


除了计时器,您还可以使用不同的外部条件来终止。


请注意循环是如何在循环代码中(在步骤 a 和 b 之间)中断的,而不是在循环代码的末尾或开始处中断,通常情况下有 repeat 或 while 标志。此外,循环中没有中断条件,并且循环中没有信号或标志检查。我相信这就是你想要的。


多处理与线程不同,我建议您研究差异以确保这适合您的情况和整体应用程序。


查看完整回答
反对 回复 2022-12-06
?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

如果您不想要太多代码,可以去掉while running, 并使用while True, 而不是if running == False: break只使用break(抱歉,如果这没有帮助)



查看完整回答
反对 回复 2022-12-06
?
拉丁的传说

TA贡献1789条经验 获得超8个赞

我认为你无法绕过 a) 确定中断条件 b) 如果满足则中断

您的方法是通过设置标志然后在循环的 while(或重复)结束时检查标志来中断。

我没有看到在您提供的循环片段中设置了“运行”标志,因此很难为您的案例提供特定于代码的示例,但也许这样做:

您可以在不设置中断标志的情况下从循环中中断:如果满足条件,只需声明“中断”:

https://docs.python.org/2.0/ref/break.html

您还可以将循环放在一个函数中,并在检测到中断条件时尽早“返回”。这通过删除所有临时变量很好地清理了您的范围。

您可以将循环放在迭代器中并引发 StopIteration 异常以指示迭代结束

https://docs.python.org/3.9/library/exceptions.html

但在所有情况下,您都无法绕过检查每个重要位置的条件,然后执行中断或停止或返回。

有时可行的方法是,如果您的循环很长,您可以重构代码以减少执行检查的位置。


查看完整回答
反对 回复 2022-12-06
?
神不在的星期二

TA贡献1963条经验 获得超6个赞

也许你可以为此使用一个线程。启动一个线程来做循环事情,并在时间到时停止。参考这篇文章https://www.geeksforgeeks.org/python-different-ways-to-kill-a-thread/


查看完整回答
反对 回复 2022-12-06
  • 4 回答
  • 0 关注
  • 62 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信