Я разрабатываю графический интерфейс, который выполняет тяжелую обработку чисел. Чтобы ускорить процесс, я использую параллельное выполнение joblib вместе с QThreads pyqt, чтобы графический интерфейс не переставал отвечать. Параллельное выполнение пока работает нормально, но если оно встроено в графический интерфейс и запускается в собственном потоке, оно использует только одно из четырех моих ядер. Что-нибудь фундаментальное, что я пропустил в мире потоковой / многопроцессорной обработки?
Вот примерный набросок моей установки:
class ThreadRunner(QtCore.QObject):
start = QtCore.pyqtSignal()
result_finished = QtCore.pyqtSignal(np.ndarray)
def __init__(self, function, *args, **kwargs):
super(DispMapRunner, self).__init__()
self.function = function
self.args = args
self.kwargs = kwargs
self.start.connect(self.run)
def run(self):
print "New Thread started"
result = self.function(*self.args, **self.kwargs)
self.result_finished.emit(result)
class Gui(QtGui.QMainWindow, form_class):
def __init__(self, cl_args, parent=None):
super(Gui, self).__init__()
#other stuff
def start_thread(self, fun, *args, **kwargs):
self.runner = ThreadRunner(fun, *args, **kwargs)
self.thread = QtCore.QThread()
self.runner.moveToThread(self.thread)
# more stuff for catching results
def slice_producer(data):
n_images, rows, cols = data.shape[:3]
for r in range(rows):
yield np.copy(data[:,r,...])
def run_parallel(data, *args, **kwargs):
results = joblib.Parallel(
n_jobs=4,
verbose=12,
pre_dispatch='1.5*n_jobs'
)
(
delayed(
memory.cache(do_long_computation))
(slice, **kwargs) for slice in slice_producer(data)
)
Надеюсь, он не слишком длинный и в то же время слишком расплывчатый. Я использую pyqt4 4.11.3 и joblib 0.8.4.
Я снова проверил свой код и заметил следующее предупреждение:
UserWarning: Multiprocessing backed parallel loops cannot
be nested below threads, setting n_jobs=1
Что уточняет мой вопрос до следующего: как запустить многопроцессорный процесс в отдельном потоке?
apply_async
, а затем используйте postEvent, чтобы избежать блокировки графического интерфейса пользователя . Фактически, можно было бы использовать этот подход с joblib (с которым я совсем не знаком) и добиться аналогичных результатов. - person ekhumoro   schedule 01.09.2015