2014-10-18 32 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

相關問題