Это нормальное поведение данного метода
Ускорить процесс можно предварительно вызвав метод
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()
Сам использую этот механизм при визуализации работы потоков