2014-10-18 3 views
0

У меня есть графический интерфейс и, щелкнув по кнопке, я должен начать большой расчет.Miltiprocessing vs multithreading

Я использую QtDesigner с питоном 2,7

В начале, у меня была проблема, что мой GUI стал отвечать на запросы в то время как большой расчет работал.

Я решил это с помощью модуля Threading:

class myMainWindow(QtGui.QMainWindow): 

    def __init__(self, parent=None): 
     #rest of the code here 

class heavyCalculations(threading.Thread): 
    def __init__(self): 
     threading.Thread.__init__(self) 
     #rest of the code here 

Мои сомнения сейчас: Давайте предположим, что я хочу, чтобы начать 4 сложных вычислений, и я хочу, чтобы использовать все 4 ядра моего компьютера работает на время. Для этого мне понадобится многопроцессорная обработка, но что мне делать, чтобы мой графический интерфейс не реагировал, но в то же время вовремя использовать 4 ядра?

Насколько я знаю, если я начинаю новый процесс для каждого тяжелого расчета, он работает параллельно, но мой графический интерфейс становится невосприимчивым.

И если я запускаю 4 потока, он также работает, и графический интерфейс не затрагивается, но это не настоящая параллель.

Любая помощь?

+0

Почему, по-вашему, потоки не параллельны? – Zaffy

+0

Нити не параллельны, процессор очень быстро перескакивает из одного в другой, делая вид, что он «параллелен», но он не параллелен, если мы вызываем параллель, когда 4 процесса работают на 4 ядра по времени. Это не то же самое. – codeKiller

+0

Я могу получить все ядра до 100% при многопоточности, поэтому я бы сказал, что один процесс! = Одно ядро ​​ – Zaffy

ответ

1

Если вы не хотите, чтобы ваши процессы вычислений замедляли ваш процесс графического интерфейса, вы должны убедиться, что ваш процесс графического интерфейса работает с более высоким приоритетом, чем ваш процесс расчета. Таким образом, всякий раз, когда есть конкуренция за ядро ​​(т. Е. Когда есть больше процессов, которые одновременно хотят запускать, чем у вашего компьютера есть ядра ядра для их запуска), процесс GUI будет получать первые dib, и процесс вычисления должен будет ждать, пока GUI закончил делать то, что он хотел сделать.

Самый простой способ добиться этого состоит в том, чтобы ваши процессы вычислений понижали свой приоритет, как первое, что они делают, прежде чем они начнут свои вычисления. Что касается того, как заставить процесс Python снизить приоритет, см. here.

+0

Спасибо, это здорово, мне нужно будет его протестировать. Еще одна вещь ... Мне все еще нужно запускать потоки и процессы или просто процессы? Я имею в виду, если последовательность должна быть: Вариант 1: MainWindow -----> запускает поток для каждого тяжелого вычисления ---> каждый поток запускает процесс. Или Вариант 2: MainWindow ---> запускает процесс для каждого тяжелого расчета. Благодарю. – codeKiller

+0

Просто процессов должно быть достаточно. Я не уверен, какое преимущество будет иметь поток для мониторинга каждого подпроцесса; Я никогда не считал это необходимым. –