python while 循环中的 setState

setState in python while loop

我是 python 的新手,我正在尝试下面的代码。我在网络开发方面有一些经验,我们有“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,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:11,736 - exiting function 4

在这里,一旦我将 运行 设置为 False,我预计 If 条件 (If 运行 == True) 会失败并因此退出程序。但它继续执行。 这应该是一个简单的修复方法,但我不知道它的功能。感谢您的帮助。

当您在 updaterunning 函数中执行 running = False 时,它会设置一个名为 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()

通过将此状态置于 class,您可以让多个 ThingDoer 并行运行而不会相互干扰(这会导致一些非常难以-调试行为),但如果你只想拥有一个 running 状态,你也可以通过让 ThingDoer 成为一个单身人士来做到这一点。