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.

Другие вопросы по тегам