条件变量,用于在完成特定任务后暂停线程(在Python中)

时间:2012-06-16 10:21:37

标签: python multithreading conditional-statements

我正在为一个程序实现一个GUI,该程序可以为总线路由问题构建和修改一个大图。

我想要一个Play按钮,它应该启动模拟(创建一个执行simulate()方法的新线程simThread,这几乎是一个无限循环,一遍又一遍地调用方法modifyGraph()) 。

我还想要一个Pause按钮,当按下时会导致simThread等待,但不是UNTIL它已完成当前对modifyGraph()的调用。这是因为在modifyGraph()期间,图形通常处于不应绘制的状态。当我再次按下播放时,simThread理想情况下应该继续播放。

我对一般的线程特别是Python相对较新,但我有一种感觉条件变量是要走的路。有谁知道如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

如果你的simThread看起来像这样:

class simThread(threading.Thread):
    def run(self):
        while True:
            modifyGraph()

你可以引入一个事件来取消暂停:

class simThread(threading.Thread):
    def __init__(self):
        self.unpaused = threading.Event()
        self.unpaused.set()
        threading.Thread.__init__(self)

    def run(self):
        while True:
            modifyGraph()
            unpaused.wait()

您可以使用以下功能:

thread = simThread()
thread.start()
thread.unpaused.clear()
[...]
thread.unpaused.set()

如果您认为名为unpaused的事件有点尴尬,您还可以使用最初设置为pause的其他布尔变量False。在线程中,您将检查它是否为True,然后等待取消暂停事件。所以像这样:

class simThread(threading.Thread):
    def __init__(self):
        self.pause = False
        self.unpause = threading.Event()
        threading.Thread.__init__(self)

    def run(self):
        while True:
            modifyGraph()
            if self.pause:
                unpause.wait()

    def pause(self):
        self.unpause.clear()
        self.pause = True

    def unpause(self):
        self.pause = False
        self.unpause.set()

thread = simThread()
thread.start()
thread.pause()
thread.unpause()

你应该使用一个事件而不是仅仅在self.pause上使用另一个while循环旋转的原因是为了避免浪费CPU周期。