Python线程问题

时间:2011-03-15 22:52:04

标签: python multithreading

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

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

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中的方法的任何建议都表示赞赏。

3 个答案:

答案 0 :(得分:1)

在不知道你正在做什么以及你正在使用什么GUI框架的情况下,我无法了解更多细节,但是根据你问题的代码代码段,听起来好像你正在寻找对于一个叫conditional variables的东西。

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

答案 1 :(得分:0)

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

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()

使用共享事件对象只是在线程之间同步和发送消息的一种方法。还有其他人,他们的用法取决于细节。

答案 2 :(得分:0)

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