【问题标题】:Python threading questionPython线程问题
【发布时间】:2011-03-15 22:52:04
【问题描述】:

我有一些带有 2 个线程的 python 应用程序。每个线程都在一个单独的 gui 中运行。 GUI 需要独立运行而不会阻塞。我想弄清楚如何让 thread_1 触发在 thread_2 中发生的事件?

下面是一些我希望函数 foo 以最简单、最优雅的方式尽快触发函数 bar 的代码,而不会消耗不必要的资源。下面是我想出的。

bar_trigger=False  #global trigger for function bar.
lock = threading.Lock()

class Thread_2(threading.Thread):
  def run(self):
    global lock, bar_trigger
    while(True):
       lock.acquire()
       if bar_trigger==True:
         Thread_2.bar()  #function I want to happen 
         bar_trigger=False
       lock.release()
       time.sleep(100) #sleep to preserve resources
                       #would like to preserve as much resources as possible 
                       # and sleep as little as possible.

  def bar(self):
       print "Bar!"

class Thread_1(threading.Thread):
  def foo(self):
      global lock, bar_trigger
       lock.acquire()
       bar_trigger=True  #trigger for bar in thread2
       lock.release()

有没有更好的方法来做到这一点?我不是线程专家,因此对于如何从 thread_1 中最好地触发 thread_2 中的方法的任何建议表示赞赏。

【问题讨论】:

  • 我不知道任何支持多线程 GUI 编程的 GUI 框架。您使用的是哪个框架?

标签: python multithreading


【解决方案1】:

在不知道您在做什么以及您正在使用什么 GUI 框架的情况下,我无法更详细地介绍,但从您的问题的 代码 sn-p 来看,听起来像您正在寻找名为conditional variables 的东西。

Python 默认包含在线程模块中,threading.Condition 下您可能也对threading.Event 感兴趣。

【讨论】:

    【解决方案2】:

    这些线程是如何实例化的?确实应该有一个主线程来监督工人。例如,

    import time
    import threading
    
    class Worker(threading.Thread):
        def __init__(self, stopper):
            threading.Thread.__init__(self)
            self.stopper = stopper
    
        def run(self):
            while not self.stopper.is_set():
                print 'Hello from Worker!'
                time.sleep(1)
    
    stop = threading.Event()
    worker = Worker(stop)
    worker.start()
    
    # ...
    
    stop.set()
    

    使用共享事件对象只是线程间同步和发送消息的一种方式。还有其他的,它们的用法取决于具体情况。

    【讨论】:

      【解决方案3】:

      一种选择是在线程之间共享一个队列。线程 1 将一条指令推入队列,线程 2 将轮询该队列。当线程 2 看到队列非空时,它会读取队列中的第一条指令并调用相应的函数。这还有一个额外的好处,那就是相当松散的耦合,可以更轻松地单独测试每个线程。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多