Python线程是否可能导致其父/主进程执行代码?

时间:2014-05-31 12:43:16

标签: python multiprocessing python-multithreading pyobjc

后台:我写了一个简单的RUMPS / PyObjC应用程序,它在各个点发出HTTP请求并弹出系统警报对话框。大多数HTTP请求都是线程化的,以避免阻止主执行。

查询:在PyObjC中你不应该在后台线程中创建警告对话框(只有主进程可以安全地执行此操作)所以我想知道是否有一个合理的模式我可以使用允许子线程与父进行通信,以通知它应该创建一个警告对话框。

举个例子:

  1. 主程序定义了popAlert()方法,调用PyObjC函数创建警告对话框。
  2. 主程序启动一个执行HTTP请求的线程,并希望在完成后弹出警报。
  3. 子线程,当HTTP请求完成时,以某种方式回调主进程以触发popAlert()
  4. 目前我让子线程创建了警告对话框,这在PyObjC中显然是不安全的。

    我对线程/多处理相当新,我到目前为止看到的线程间通信示例似乎主要涉及子线程从类似队列的机制接收消息,父节点可选地阻塞,直到队列为空。我还没有看到任何迹象表明父母是否可能以我描述的方式回应来自子线程的消息。

    如果这样做需要重新架构,那也没关系 - 我不会拘泥于任何特定的多处理方法。

    非常感谢任何建议。如果我能提供更多细节,请告诉我。非常感谢您的阅读。

2 个答案:

答案 0 :(得分: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 example app中更具体地使用它。特别查看WSTConnectionWindowControllerClass.py。

答案 1 :(得分:1)

您还可以使用队列将消息从子节点传输到父节点。这里的问题是,你需要在主线程中有一个消息循环,它定期读取消息队列以显示消息。