2012-01-08 17 views
5

私はマルチプロセッシング初心者だ、Pythonの、マルチスレッド遅すぎる、マルチ

私はスレッドについて何かを知っているけど、私はうまくいけばマルチプロセッシングと、この計算を高速化する必要があります。

例説明:はスレッドに文字列を送信し、文字列+ベンチマークテストを変更し、 結果を印刷に戻します。

from threading import Thread 

class Alter(Thread): 
    def __init__(self, word): 
     Thread.__init__(self) 
     self.word = word 
     self.word2 = '' 

    def run(self): 
     # Alter string + test processing speed 
     for i in range(80000): 
      self.word2 = self.word2 + self.word 

# Send a string to be altered 
thread1 = Alter('foo') 
thread2 = Alter('bar') 
thread1.start() 
thread2.start() 

#wait for both to finish 
while thread1.is_alive() == True: pass 
while thread2.is_alive() == True: pass 


print(thread1.word2) 
print(thread2.word2) 

これは現在、約6秒かかりれ、私はそれがより速く移動する必要があります。
私はマルチプロセッシングを検討しており、上記のコードに相当するものを見つけることができません。私が思うにはプールですが、私が見つけた例は分かりづらいものです。私はすべてのコア(8コア)multiprocessing.cpu_count()を利用したいと思いますが、私は実際にマルチプロセッシングに関する有用な情報のスクラップを持ち、上記のコードを複製するのに十分ではありません。もし誰かが私を正しい方向に向けることができれば、より良い方法を見つけることができます。 Python 3 please

+2

スレッドが完了するまでビジー状態ではありません。 Thread.join()を使用してください! – soulcheck

+0

なぜですか?私はコーディングの大部分でこれを行いました。もしあなたが良い理由を提供できるのであれば、私はそれをすべて変更します:) – Rhys

+1

それは少なくともビジー待機と同じくらい良く、スレッドを食べることなくスレッドが終了するまでcpu(ただし、私はcpythonがThread.join()の中でビジーではないので、私は賭けたいと思っています。 – soulcheck

答えて

6

ThreadProcessに置き換えてください。 Pytonのスレッドは、大きな悪いGILのために(ほとんど)パフォーマンスを得るために使用されていません!別のSO-postで説明しています。great talk about threading in python.

しかし、multiprocessingモジュールは意図的にスレッドモジュールと非常によく似ています。あなたはほぼそれをドロップインの代替品として使うことができます!

マルチプロセッシングモジュールでは、特定の量のコアを使用する機能をAFAIKが提供していません。それはOS実装に依存します。 Poolオブジェクトを使用し、ワーカー・オブジェクトをcore-countに制限することができます。あるいは、pyparのような他のMPIライブラリを探すこともできます。 Linuxでは、シェルの下のパイプを使用して、異なるコアで複数のインスタンスを起動することができます

+0

Pythonがマルチプロセッシングとマルチコアでのスレッド処理をどのように処理するかについては、[here](http://www.martinkral.sk/blog/2011/03/python-multicore-vs-threading-example/) – fuzzyanalysis

+0

@Don、Yes !それは動作するようです。私はちょうどどのくらい速くその実行を確認する必要があります。 1つのことですが、上記のコードでは使用するコアの数を指定していません...これを組み込むのは簡単でしょうか? – Rhys

+0

それは私にとって十分に良いです。受け入れられました:) – Rhys