Несколько потоков QWebView в PyQt4

Вот ситуация: у меня есть класс, который загружает определенный URL, а также список параметров, которые мне нужно отправить на этот URL. Я хочу использовать потоки, чтобы загрузить этот URL вроде "одновременно", другими словами вместо того, чтобы загрузить один QWebView, чем закончить его, чем загрузить другой, который я хочу открывать 5 окнами одновременно.

Хорошо, теперь проблема в том, что каждое окно будет иметь разную скорость, поэтому мне нужно отслеживать, какие параметры используются.

например:

params = [1,2,3,4,5,6,7]
a = MyClass(1)
b = MyClass(2)
c = MyClass(3)

теперь, если предположим, что класс b закончил до двух других классов, он получит значение 4 и запустит его снова.

И это пример кода:

#! /usr/bin/env python2.7

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

class Grabber(QWebView):
    def __init__(self, param=None):
        QWebView.__init__(self)
        self.loadFinished.connect(self._loadComplete)
        url = QUrl('http://some website.com/search?param=%s'%param)
        self.load(url)
        self.show()

    def _loadComplete(self):
        print "Done"

if __name__ == "__main__":
    app = QApplication(sys.argv)
    # Dont know what to do with the next 2 lines
    thread_pool = QThreadPool()
    thread_pool.setMaxThreadCount(10)

    param = [1,2,3,4,5,6,7,8,9,10,11,12] # and so on

    # Whant to achive something similar:
    for i in param:
        a = Grabber(i)
        b = Grabber(i)
        c = Grabber(i)
        d = Grabber(i)
        e = Grabber(i)

    if signal.signal(signal.SIGINT, signal.SIG_DFL):
        sys.exit(app.exec_())
    app.exec_() 

Я почти уверен, что мне нужно использовать потоки, нити Ether Python или PyQt4 QThread.

1 ответ

Решение

Посмотрите, работает ли что-то подобное. Что это bookie класс хранит количество раз loadFinished вызывается в переменную countи возвращает соответствующий элемент в списке params, При создании grabber объекты, он отображает его на номер через QSignalMapperТаким образом, вы можете получить отправителя сигнала, позвонив mapper.mapping(id-of-grabber-object), Вы можете пойти дальше и попробовать этот код, чтобы увидеть, работает ли он для вас, прежде чем изменять ваш:

#!/usr/bin/env python
from PyQt4.QtCore import pyqtSlot, QObject, QSignalMapper, QTimer
from PyQt4.QtGui import QApplication
from PyQt4.QtWebKit import QWebView


class bookie(QObject):
    def __init__(self, parent=None):
        super(bookie, self).__init__(parent)

        self.count  = 0
        self.url    = 'http://some website.com/search?param={0}'
        self.params = range(100) # instead of [1,2,3,4,5,6,7,8,9,10,11,12] and so on...

        Grabber = QWebView # This would be your Grabber class

        self.mapper = QSignalMapper(self)
        self.mapper.mapped.connect(self.on_mapper_mapped)

        for grabberNumber in range(10): # Create 10 Grabber instances
            grabber = Grabber()
            grabber.loadFinished.connect(self.mapper.map)

            self.mapper.setMapping(grabber, grabberNumber)

            grabber.loadFinished.emit(True) # Initialize the grabber by emitting loadFinished

    def on_mapper_mapped(self, gNumber):
        self.count += 1
        if self.count < len(self.params):
            gParam  = self.params[self.count]   
            grabber = self.mapper.mapping(gNumber)
            #grabber.load(QUrl(self.url.format(gParam)))

            # Next 2 lines for testing purposes, remove & uncomment the previous line

            print "GRABBER:", gNumber, "PARAMETER:", gParam
            QTimer.singleShot(1, lambda:grabber.loadFinished.emit(True)) 

if __name__ == "__main__":
    import  sys

    app = QApplication(sys.argv)
    main = bookie()
Другие вопросы по тегам