2014-10-18 30 views
0

我有一个GUI,通过点击一个按钮,我必须开始一个大计算。Miltiprocessing vs multithreading

我使用QtDesigner与Python 2.7

在开始的时候,我有而大计算正在我的GUI没有响应的问题。

我解决了这个使用线程模块:

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个内核的我的电脑前工作的时间。为此我需要多处理,但是我应该怎么做以避免我的GUI变得无法响应,但同时要按时使用4个内核?

据我所知,如果我开始一个新的进程为每个繁重的计算,它确实并行工作,但我的GUI变得无法响应。

如果我启动4个线程,它也可以工作,GUI不受影响,但这不是真正的并行。

任何帮助?

+0

为什么你认为线程不平行? – Zaffy 2014-10-18 20:55:05

+0

线程并不平行,处理器从一个跳转到另一个跳转非常快,假装是“并行”的,但如果我们在4个进程按时处理4个内核时并行调用并行处理器,则处理器并不是并行处理。这是不一样的。 – codeKiller 2014-10-18 20:58:06

+0

我可以通过多线程使所有内核达到100%,所以我会争辩说一个进程!=一个内核 – Zaffy 2014-10-18 21:04:20

回答

1

如果您不希望计算过程减慢GUI过程,则应确保GUI过程的运行优先级高于计算过程。这样,每当有核心竞争时(即当有更多的进程同时想运行,而你的计算机有CPU核心运行它们时),GUI进程将获得第一个dib,计算过程将不得不等待GUI完成了它想做的任何事情。

最简单的方法是让计算过程在开始计算之前降低自己的优先级,作为他们做的第一件事。至于如何让Python进程降低其优先级,请参见here

+0

谢谢,这听起来不错,我需要测试它。还有一件事...我是否还需要运行线程和进程或只是进程?我的意思是,如果序列应该是这样的:选项1:MainWindow ----->为每个繁重的计算运行一个线程--->每个线程运行一个进程。或者选项2:MainWindow --->为每个繁重的计算运行一个过程。谢谢。 – codeKiller 2014-10-19 05:23:53

+0

只需进程就足够了。我不确定拥有一个线程来监视每个子进程会带来什么好处;我从来没有发现它是必要的。 – 2014-10-19 14:56:36

相关问题