Python 使用 pypubsub 和 wx 的多线程
Python multithreading with pypubsub and wx
我有一个结构如下的程序:
GUI
是用wxPython制作的,在主线程中。启动应用程序后,GUI 线程创建 Thread1
,它创建一个静态 class Class1
,它创建 Thread2
.
Thread1 使用 wx.PostEvent
与 GUI 对话,一切正常。我还需要 Thread1 与 Thread2 通信,所以我决定使用 pyPubSub 来实现。 Thread2 需要在后台工作,因为它包含一些定期执行的操作,但它还包含 Thread1 需要在某些事件上调用的函数(比方说 my_func()
)。我决定将 my_func()
放在 Thread2 中,因为我不希望它停止 Thread1 的执行,但这正是发生的事情:在 Thread1 中,在某些事件之后我使用 pub.sendMessage("events", message="Hello")
来触发 my_func()
; Thread2 的结构如下:
class Thread2(Thread)
def __init__(self, parent):
super().__init__()
self.parent = parent
pub.subscribe(self.my_func, "events")
def run(self):
while True:
# do stuff
def my_func(self, message):
# do other stuff using the message
# call parent functions
Thread2 的父级是 Class1,所以当我在 Class1 中创建线程时,我这样做:
self.t2 = Thread2(self)
self.t2.start()
为什么 Thread2 会停止 Thread1 的执行?
换句话说,pypubsub 的 sendMessage
实际上是 调用 您的侦听器函数,因此等待它 return在继续之前。如果此侦听器函数花费大量时间 运行,那么您获得的行为显然是线程的“阻塞”。
在这里您可能想要 'send' 一个轻量级消息来触发计算,并 'listen' 在另一个地方以 'non-blocking' 的方式得到结果。
我有一个结构如下的程序:
GUI
是用wxPython制作的,在主线程中。启动应用程序后,GUI 线程创建 Thread1
,它创建一个静态 class Class1
,它创建 Thread2
.
Thread1 使用 wx.PostEvent
与 GUI 对话,一切正常。我还需要 Thread1 与 Thread2 通信,所以我决定使用 pyPubSub 来实现。 Thread2 需要在后台工作,因为它包含一些定期执行的操作,但它还包含 Thread1 需要在某些事件上调用的函数(比方说 my_func()
)。我决定将 my_func()
放在 Thread2 中,因为我不希望它停止 Thread1 的执行,但这正是发生的事情:在 Thread1 中,在某些事件之后我使用 pub.sendMessage("events", message="Hello")
来触发 my_func()
; Thread2 的结构如下:
class Thread2(Thread)
def __init__(self, parent):
super().__init__()
self.parent = parent
pub.subscribe(self.my_func, "events")
def run(self):
while True:
# do stuff
def my_func(self, message):
# do other stuff using the message
# call parent functions
Thread2 的父级是 Class1,所以当我在 Class1 中创建线程时,我这样做:
self.t2 = Thread2(self)
self.t2.start()
为什么 Thread2 会停止 Thread1 的执行?
换句话说,pypubsub 的 sendMessage
实际上是 调用 您的侦听器函数,因此等待它 return在继续之前。如果此侦听器函数花费大量时间 运行,那么您获得的行为显然是线程的“阻塞”。
在这里您可能想要 'send' 一个轻量级消息来触发计算,并 'listen' 在另一个地方以 'non-blocking' 的方式得到结果。