markus1578
@markus1578

Threads.wait() — долгое ожидание ожидание завершения потоков. Как ускорить?

При остановке потоков использую метод wait() для ожидания остановки потока
В потоках выполняются запросы через requests и поэтому может быть долгое ожидание и происходит долгое зависание gui

Как ускорить ?

for thread in self.threads:
    QtWidgets.qApp.processEvents()
    thread.stop_theader()

    # thread.wait() большие задержки
    while not thread.wait():
        QtWidgets.qApp.processEvents()
  • Вопрос задан
  • 38 просмотров
Решения вопроса 1
seven5674
@seven5674
Старый я уже что бы что-то в себе менять
Это нормальное поведение данного метода
Ускорить процесс можно предварительно вызвав метод terminate но следует понимать что данный вариант не снимает блокировки если таковые были и если есть работа в БД то может произойти что-нибудь непредвиденное

Есть другой вариант а именно отказаться вообще от метода wait а использовать сигналы с дополнительной проверкой

Например в thread можно переопределить сигнал finished и возвращать id потока в управляющий код с последующим удалением потока из, например, словаря.

1. При создании потока в управляющем коде заносим данные о потоке в словарь
self.threads["thread_{}".format(i)] = thread

2. Для создаваемых потоков регистрируем событие finished
thread.on_finished.connect(self.on_finished)

3. В потоке переопределяем событие finished
self.finished.connect(self.on_finished)

4. При завершении потока генерим сигнал и передаем в управляющий код id потока
self.on_finished.emit(self.thread_id)

5. При срабатывании сигнала finished в управляющем коде удаляем поток из словаря self.threads
self.threads.pop("thread_{}".format(thread_id))

6. Ну а теперь ждем завершения потоков не через wait() а как-то так
while self.threads:
    QtWidgets.qApp.processEvents()


Сам использую этот механизм при визуализации работы потоков
627f7062da0f5768127213.jpeg
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы