Как настроить несколько многопоточных QWebViews в PyQt? - PullRequest
0 голосов
/ 22 августа 2011

Я пытаюсь создать приложение на Python, использующее PyQt, которое может извлекать сгенерированное содержимое списка 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_())

Выше я попытался инициализировать QWebView в главном QApplication только для получения:

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

Итак, я попытался инициализировать QWebView в QThread ;но затем QWebView остался неизменным и пустым без вывода каких-либо ошибок или чего-либо еще.Вероятно, это произошло из-за ошибки в кэше.


У меня такое ощущение, что я что-то упускаю или пропускаю очень важный шаг.Поскольку потоковые QWebViews в PyQt не являются действительно документированной темой, я был бы очень признателен за любую помощь в том, как успешно реализовать это.

1 Ответ

4 голосов
/ 22 августа 2011

Существует несколько проблем с вашим вопросом и кодом:

  • Вы говорите о QWebFrame , но фактически передаете QWebView своему работнику (с).Поскольку это QWidget , он принадлежит основному потоку (GUI) и не должен изменяться другими потоками.
  • One QWebView / QWebFrame может загружать только один URL-адрес за раз, поэтому вы не можете поделиться им с несколькими рабочими.
  • QWebFrame.load () загружает данные асинхронно, то есть вызывает load () возвращается немедленно и данных для чтения пока не будет.Вам придется подождать, пока не будет получен сигнал loadFinished () , прежде чем вы сможете получить доступ к данным.
  • Поскольку фактическая загрузка выполняется сетевым уровнем операционной системы и load () метод не блокирует, нет необходимости запускать его в отдельном потоке в первую очередь.Почему вы утверждаете, что это должно быть быстрее - это не имеет смысла.
  • Поскольку вы хотите загружать сотни URL-адресов параллельно (или около 10, вы упоминаете оба в одном предложении), вы уверены, чточто вы хотите использовать QWebFrame , который является презентацией класса?Вы действительно хотите визуализировать HTML или вы просто заинтересованы в полученных данных?
...