微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python中的setState while循环

如何解决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 举报,一经查实,本站将立刻删除。