我有一些带有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中的方法的任何建议都表示赞赏。
答案 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看到队列非空时,它会读取队列中的第一条指令并调用相应的函数。这具有额外的好处,即相当松散的耦合,可以使每个线程更容易测试。