0

我正在尝试使用 PyQt 在 Python 中创建一个应用程序,该应用程序可以获取 URL 列表的生成内容并在多个线程的帮助下处理获取的源。我需要一次运行大约十个 QWebView。听起来很荒谬,当涉及到数百个 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 不是一个真正记录的主题,我非常感谢有关如何成功实现这一点的任何帮助。

4

1 回答 1

4

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

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