如何解决python中的setState while循环
我是 python 的新手,我正在尝试下面的代码。我在 Web 开发方面有一些经验,我们有“setState()”函数。我们在python中是否有类似的功能。
下面是我的代码:
running = True
def updaterunning():
logger.info("running is set")
running = False
def func_function4():
logger.info("starting function 4")
timeout = time.time() +10
a=1
while time.time() <= timeout:
if running == True:
logger.info("function 4 : %s",a)
a+=1
time.sleep(1)
if a == 7:
updaterunning()
logger.info("exiting function 4")
f4 = threading.Thread(target = func_function4)
f4.start()
实际输出:
2021-06-26 22:57:01,604 - starting function 4
2021-06-26 22:57:01,609 - function 4 : 1
2021-06-26 22:57:02,623 - function 4 : 2
2021-06-26 22:57:03,637 - function 4 : 3
2021-06-26 22:57:04,652 - function 4 : 4
2021-06-26 22:57:05,663 - function 4 : 5
2021-06-26 22:57:06,675 - function 4 : 6
2021-06-26 22:57:07,686 - running is set
2021-06-26 22:57:07,688 - function 4 : 7
2021-06-26 22:57:08,696 - function 4 : 8
2021-06-26 22:57:09,703 - function 4 : 9
2021-06-26 22:57:10,718 - function 4 : 10
2021-06-26 22:57:11,736 - exiting function 4
预期输出:
2021-06-26 22:57:01,686 - running is set
2021-06-26 22:57:11,736 - exiting function 4
在这里,一旦我将 running 设置为 False,我希望 If 条件 (If running == True) 失败并因此退出程序。但它继续执行。 这应该是一个简单的修复,但我不知道该功能。感谢您的帮助。
解决方法
当您在 running = False
函数中执行 updaterunning
时,它会设置一个名为 running
的局部变量;外部作用域中的变量没有改变。
解决此问题的一种方法是使用全局变量,但 IMO 更好的解决方案是将此状态放入对象中。
class ThingDoer:
def __init__(self):
self.running = False
def updaterunning(self):
logger.info("running is set")
self.running = False
def func_function4(self):
logger.info("starting function 4")
self.running = True
timeout = time.time() +10
a = 1
while time.time() <= timeout:
if self.running == True:
logger.info("function 4 : %s",a)
a+=1
time.sleep(1)
if a == 7:
self.updaterunning()
logger.info("exiting function 4")
f4 = threading.Thread(target = ThingDoer().func_function4)
f4.start()
通过将此状态放在一个类中,您可以让多个 ThingDoer
并行运行而不会相互干扰(这会导致一些非常难以调试的行为),但是如果如果您只想拥有一个 running
状态,也可以通过让 ThingDoer 成为单例来实现。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。