2011-03-15 76 views
0

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

以下是我希望函数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中的方法的建议,我们都会很感激。

+1

我不知道任何支持多线程GUI编程的GUI框架。你在使用哪个框架? – 2011-03-15 23:00:27

回答

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

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

0

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

1

不知道你在做什么,你正在使用的GUI框架,我不能进入更多的细节,但是从你的问题的代码片段,这听起来像你正在寻找的东西叫做conditional variables

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