У меня 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()
, но это не дает никакой разницы
если у кого-то есть идеи по этому поводу, это будет действительно здорово:)