如何在PyQt中设置多个多线程QWebView?

时间:2011-08-22 04:11:58

标签: python multithreading qt pyqt qwebview

我正在尝试使用PyQt在Python中创建一个应用程序,它可以获取URL列表的生成内容,并在多个线程的帮助下处理获取的源。我需要一次运行大约十个QWebViews。听起来很荒谬,当谈到数百个URL时,使用线程QWebViews的结果比正常情况快3倍。


以下是我遇到问题的测试代码......

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtWebKit import *

class Worker(QThread):
    def __init__(self, url, frame):
        QThread.__init__(self)
        self.url = url
        self.frame = frame
    def run(self):
        self.frame.load(QUrl(self.url))
        print len(self.frame.page().mainFrame().toHtml())


app = QApplication(sys.argv)
webFrame = QWebView()

workerList = []
for x in range(1):
    worker = Worker('http://www.google.com', webFrame)
    workerList.append(worker)
for worker in workerList:
    worker.start()

sys.exit(app.exec_())

上面,我尝试初始化 QApplication 中的 QWebView ,只是为了得到:

QObject: Cannot create children for a parent that is in a different thread.

然后我尝试在 QThread 中初始化 QWebView ;但是, QWebView 保持不变并且空白而没有输出任何错误或任何内容。这可能是由于缓存错误造成的。


我觉得我错过了某些事情或者跳过了非常重要的一步。由于PyQt 中的线程QWebViews不是一个真正记录的主题,我真的很感激如何成功实现它。

1 个答案:

答案 0 :(得分:4)

您的问题和代码存在多个问题:

  • 您正在谈论 QWebFrame ,但实际上是将 QWebView 传递给您的工作人员。由于这是一个 QWidget ,它属于主(GUI)线程,不应被其他线程修改。
  • 一个 QWebView / QWebFrame 一次只能加载一个网址,因此您无法在多个工作人员之间共享该网址。
  • QWebFrame.load()异步加载数据,即对 load()的调用立即返回,并且没有数据可供读取。在访问数据之前,您必须等待 loadFinished()信号发出。
  • 由于实际加载是由操作系统的网络层完成的,并且 load()方法没有阻塞,因此无需首先在单独的线程中运行它。为什么你声称这应该更快 - 这没有任何意义。
  • 由于你想要并行加载数百个URL(或者大约10个,你在同一个句子中提到这两个),你确定要使用 QWebFrame ,这是一个演示课程?您真的想要呈现HTML还是只对检索到的数据感兴趣?