Python线程能让父进程执行代码吗?
背景:我写了一个简单的 RUMPS/PyObjC 应用程序,这个程序在不同的时刻会发出 HTTP 请求,并弹出系统警告对话框。大部分的 HTTP 请求都是在单独的线程中执行,以避免阻塞主程序的运行。
问题:在 PyObjC 中,不应该在后台线程中创建警告对话框(只有主线程是安全的)。所以我在想,有没有一种合理的方法,可以让子线程与父线程沟通,通知它应该创建一个警告对话框。
举个例子:
- 主程序定义了一个
popAlert()
方法,这个方法调用 PyObjC 的函数来创建警告对话框。 - 主程序启动一个线程来执行 HTTP 请求,并希望在完成后弹出一个警告。
- 子线程在 HTTP 请求完成时,想办法回调主线程,触发
popAlert()
方法。
目前我让子线程直接创建警告对话框,但这在 PyObjC 中显然是不安全的。
我对线程和多进程还比较陌生,看到的线程间通信的例子大多是子线程从某种类似队列的机制中接收消息,父线程可以选择在队列为空之前阻塞。我还没有看到任何表明父线程能以我描述的方式响应子线程消息的例子。
如果要实现这个功能需要重新设计架构,那也没问题——我并不执着于某种特定的多进程方法。
任何建议都非常感谢。如果需要更多细节,请告诉我。非常感谢你的阅读。
2 个回答
1
你还可以用一个队列来把消息从子线程传递到父线程。这里的问题是,你需要在主线程里有一个消息循环,定期读取这个消息队列,以便显示消息。
2
看看这个链接 pyobjc_performSelectorOnMainThread。这可能正是你需要的东西。这里有一个简单的使用示例:
class MyClass (NSObject):
def divideByZero_(self, arg):
return arg/0
def doit(self):
try:
result = self.performSelectorOnMainThread_withObject_(
'divideByZero:', 55)
print result
except:
print "Division failed"
你可以在这个 PyObjC 示例应用 中看到它的具体用法。特别是可以查看一下 WSTConnectionWindowControllerClass.py 文件。