выйти из QThread 1000 - pyqt5 - PullRequest
0 голосов
/ 03 июля 2018

У меня python приложение с графическим интерфейсом пользователя Qt

Я использую pyqt5

приложение должно создать 1000 или более Qthreads, каждый поток будет использовать pycurl для открытия внешнего URL

Я использую этот код для открытия тем:

self.__threads = []
# workerClass thread
for i in range(1000):
    workerInstance =  workerClass()
    workerInstance.sig.connect(self.ui.log.append)
    thread = QThread()
    self.__threads.append((thread, workerInstance))
    workerInstance.moveToThread(thread)
    thread.started.connect(workerInstance.worker_func)
    thread.start()

WorkerClass будет использовать простой pycurl для посещения внешнего URL-адреса и подачи сигнала для добавления некоторой информации в журнал, вот код:

class workerClass(QObject):
    x = 1
    sig = pyqtSignal(str)

    def __init__(self, linksInstance, timeOut):
        super().__init__()
        self.linksInstance = linksInstance
        self.timeOut = timeOut

    @pyqtSlot()
    def worker_func(self):
        while self.x:
            # run the pycurl code
            self.sig.emit('success!') ## emit success message

Теперь проблема в том, чтобы остановить все это, я использовал следующий код для кнопки остановки:

def stop_func(self):
    workerClass.x = 0
    if self.__threads:
        for thread, worker in self.__threads:
            thread.quit()
            thread.wait()

изменение workerClass.x на 0 остановит while self.x в классе workerClass, а выход и ожидание должны закрыть все потоки

все это работает правильно, НО только в небольшом количестве потоков, 10 или может быть 100 но если я запускаю 1000 потоков, это занимает много времени, я жду 10 минут, но он не остановился (значит, потоки не прерваны), однако время ожидания pycurl составляет всего 15 секунд

Я также использовал: self.thread.exit() self.thread.quit() self.thread.terminate(), но это не дает никакой разницы

если у кого-то есть идеи по этому поводу, это будет действительно здорово:)

1 Ответ

0 голосов
/ 06 июля 2018

после некоторых попыток, я удалил код pycurl и протестировал, чтобы запустить 10k QThreads и остановил его, и это прекрасно работает без каких-либо ошибок. поэтому я определяю, что ошибка с кодом pycurl.

Согласно совету Эхуморо в комментариях к вопросу, я могу попробовать использовать pycurl multi

но сейчас я добавил эту строку в код pycurl:

c.setopt(c.TIMEOUT, self.timeOut)

Я использовал только это:

c.setopt (c.CONNECTTIMEOUT, self.timeOut)

так что теперь с обоими двумя параметрами все работает нормально, запускает и останавливает массовые qthreads

...