2012-05-18 28 views
2

我編寫了一個小程序來評估元胞自動機的狀態並將其繪製在屏幕上。我有雙核PC,所以爲了提高效率,我決定在兩個線程中進行計算。我做了我自己的QThread的實現,就像這樣:Python和Qt中的併發編程

clacc MyThread(QThread): 
    def run(self): 
     ... 

然後我做這個類的兩個實例,並美其名曰:

thread1 = MyThread() 
thread2 = MyThread() 

thread1.start() 
thread2.start() 

當我打開任務管理器,我發現他們'一個接一個地執行:首先是thread1,然後是thread2,然後再次是thread1,依此類推。 問題是:有沒有辦法調用它們,以便它們可以獨立工作,在不同的內核上,在一個時刻,而不是一個接一個地工作?

+0

取決於你的線程實際上做了什麼。看起來他們只是沒有足夠的CPU來安排在兩個內核上,或者他們正在使用一個共享資源,並因此而前進。 – Mat

+1

你可能想看看這個:http://blip.tv/carlfk/mindblowing-python-gil-2243379。 Python中的線程相當尷尬,至少可以說至少可以說 – TeaOverflow

+2

@Evgeni - 你所說的是真實的,除了'QThreads'還有它們[自己的線程模型和問題](http:// qt-project .ORG/DOC /線程basics.html)。 @aga - 你應該看看那個任務管理器,你也可以看到 – mata

回答

2

如果你使用線程,你不能像你想的那樣提高效率,因爲它不會進行並行化。你需要做多處理。要做到這一點,你可以使用mulltiprocessing模塊,它就像線程模塊:

import multiprocessing 

class MyProcess(multiprocessing.Process): 

    def run(self): 
     # new process context 

你不會共享相同的背景,所以你不能用方法的調用直接通信。我建議你使用一些「消息隊列」系統,如:multiprocessing.Queue或者zeromq(偉大的lib!)。

如果你看看「Ventillator」zmq設計模式,你會發現它完全符合你的需求:使工人平等。

+0

我是這麼做的。 :)謝謝你的建議。 – aga

+0

不客氣! – dawi