Python PySide浏览器在一个单独的进程中

Python PySide浏览器在一个单独的进程中,python,qt,inheritance,processing,pyside,Python,Qt,Inheritance,Processing,Pyside,我试图编写一个简单的解析器,它检查一些网页,如果这些网页上的内容发生了变化,那么脚本将url发送到headless webkit浏览器,该浏览器使用PySide绑定到Qt运行,并生成一个屏幕截图。我希望此浏览器始终在后台单独运行,等待url出现在队列中。一旦url出现,它就会制作屏幕截图,保存它,然后返回等待 我尝试用以下代码实现此行为(我剪切了解析器部分): 问题是,在第一次运行时,进程成功地保持等待状态,等待url出现在队列中,但一旦它获得url,进程就会停止,忽略Qt连接 self.mai

我试图编写一个简单的解析器,它检查一些网页,如果这些网页上的内容发生了变化,那么脚本将url发送到headless webkit浏览器,该浏览器使用PySide绑定到Qt运行,并生成一个屏幕截图。我希望此浏览器始终在后台单独运行,等待url出现在队列中。一旦url出现,它就会制作屏幕截图,保存它,然后返回等待

我尝试用以下代码实现此行为(我剪切了解析器部分):

问题是,在第一次运行时,进程成功地保持等待状态,等待url出现在队列中,但一旦它获得url,进程就会停止,忽略Qt连接

self.mainFrame().loadFinished.connect(self._makeScreenshot)
问题是如果我直接从进程继承

class Browser(multiprocessing.Process):
    def __init__(self, queue_in, queue_out):
        multiprocessing.Process.__init__(self)
        self.queue_out = queue_out
        self.queue_in = queue_in
        self.app = QtGui.QApplication(sys.argv)
        self.browser = QtWebKit.QWebPage()
        ...
if __name__ == "__main__":
    queue_in = multiprocessing.Queue()
    queue_out = multiprocessing.Queue()
    b = Browser(queue_in, queue_out)
然后,连接不会被忽略,所有连接都可以正常工作,但作为一种副作用,在浏览器进程中调用的
self.queue\u in.get()
也会阻塞主进程(如果队列为空)

问题:

  • 为什么Qt连接在第一种情况下不工作,而在另一种情况下工作
  • 为什么在第二种情况下,queue.get()会阻止主进程?如何预防

  • Queue.get()
    在队列为空时阻塞。使用,如果没有任何异常,它将引发异常。

    看来调用app.exec_u2;()是必要的。现在一切都好了。除了我

    warning qapplication was not created in the main()
    
    尽管一切都很好,但我还是决定把它搬到主楼去

    app = QtGui.QApplication(sys.argv)
    browser = Browser(queue_in, queue_out)
    app.exec_()
    
    并在单独的进程中运行解析器部分

    UPD

    了解了如何在进程中运行QApplication

    class QtApp(QtGui.QApplication):
    """
    docstring
    """
    def __init__(self, args, url_queue, filename_queue):
        QtGui.QApplication.__init__(self, args)
        browser = Browser(url_queue, filename_queue)
        self.exec_()
    
    browser_process = multiprocessing.Process(target=QtApp, 
                                              args=(sys.argv, url_queue, filename_queue))
    

    好。但此时我需要我的浏览器继续运行。因此,在这种情况下,我需要在流程中创建一个异常处理程序,并定期检查队列中是否有内容?大概我还可以创建另一个用于分析该部分的进程,不必担心主进程被阻塞。这不是我想知道的。我更感兴趣的是为什么会发生这种情况。但是谢谢你的解决办法。
    class QtApp(QtGui.QApplication):
    """
    docstring
    """
    def __init__(self, args, url_queue, filename_queue):
        QtGui.QApplication.__init__(self, args)
        browser = Browser(url_queue, filename_queue)
        self.exec_()
    
    browser_process = multiprocessing.Process(target=QtApp, 
                                              args=(sys.argv, url_queue, filename_queue))