PyQt5 запускает вычисления sklearn на отдельном QThread
Я создаю приложение PyQt5 и хочу запускать некоторый ML-код в отдельном потоке при нажатии кнопки. Я не могу этого сделать. Это мой код потока:
newthread = QtCore.QThread()
runthread = RunThread()
runthread.moveToThread(newthread)
runthread.finished.connect(newthread.quit)
newthread.started.connect(runthread.long_run)
newthread.start()
И класс RunThread выглядит следующим образом:
class RunThread(QtCore.QObject):
finished = QtCore.pyqtSignal()
def __init__(self):
super().__init__()
@pyqtSlot()
def long_run(self):
#ML code called in the line below
simulation.start_simulation()
self.finished.emit()
Запуск обычно не работает. Pycharm выходит со следующей ошибкой:
process finished with exit code -1073740791 (0xc0000409)
Запуск его в режиме отладки выдает тысячи предупреждений, выдаваемых sklearn:
Multiprocessing-backed parallel loops cannot be nested below threads,
setting n_jobs=1
Код выполняется в конце концов, но для этого требуется гораздо больше времени (по крайней мере, 4 раза).
Может кто-нибудь, пожалуйста, дайте мне знать, в чем проблема?
1 ответ
Предупреждение от sklearn здесь довольно явное. В принципе, вы не можете тренировать модели склеарна с гиперпараметром n_jobs
установить значение больше 1 при выполнении из вложенного потока.
При этом, не видя, что происходит внутри simulation.start_simulation()
это трудно догадаться.
Мое лучшее предположение было бы искать что-нибудь в start_simulation()
который использует несколько заданий и посмотреть, что произойдет, когда вы установите это n_jobs=1
,
В качестве альтернативы вы можете попробовать написать свой ML-код в виде отдельного скрипта и выполнить его с помощью QProcess. Это может позволить вам использовать n_jobs
больше 1.