等待类变量通过线程更改

2 投票
1 回答
3469 浏览
提问于 2025-04-18 14:35

我有一个类,这个类里面有一个布尔变量(就是只有真和假两种状态的变量),还有一个函数,这个函数会等待这个布尔变量的值改变,然后再执行一些代码。下面是一个(有点傻的)例子:

import time

class SomeClass():
    def __init__(self):
        self._var = False

    def setVar(self, state):
        self._var = state

    def waitForVarToChange(self):
        while not self._var:
            continue

        print 'Variable changed'
        self._var = False

if __name__ == "__main__":
    myclass = SomeClass()

    while True:
        myclass.waitForVarToChange()
        time.sleep(0.5)
        myclass.setVar(True)

在这个例子中,waitForVarToChange() 方法会在一个循环里一直“等待”,直到这个变量的值发生变化。根据我所知道的,我应该在这里使用 线程 和/或 事件。不过,我对如何为这样的例子实现一个线程并没有什么头绪。有没有人能帮帮我?

1 个回答

4

可以考虑使用 multiprocessingQueue,就像 @BlackJack 提到的那样。这种方式更容易操作,特别是 Pool 对象。

这里有一个多线程的解决方案。一个线程启动后,等待一段时间,然后设置一个线程安全的 Event 对象。第二个线程在等待这个 Event,当事件被触发后,它会打印一条消息并退出。

源代码

import threading, time


def flagger_thread(event):
    time.sleep(2)
    event.set()

def waiter_thread(event):
    print("Waiting for event")
    if event.wait(5):
        print("event set.")
    else:
        print("Timed out.")

stop_event = threading.Event()
threading.Thread(target=flagger_thread, args=[stop_event]).start()
threading.Thread(target=waiter_thread, args=[stop_event]).start()

for t in threading.enumerate():
    if t != threading.current_thread():
        t.join()

输出结果

Waiting for event
event set.

撰写回答