web-dev-qa-db-ja.com

pythonはマルチプロセッサ/マルチコアプログラミングをサポートしていますか?

マルチプロセッサプログラミングとマルチコアプログラミングの違いは何ですか?できればpythonで例を示してください。マルチプログラミングとマルチコアプログラミングのための小さなプログラムの書き方

69
gath

「マルチプロセッサ」または「マルチコア」プログラミングのようなものはありません。 「マルチプロセッサ」と「マルチコア」の区別computersは、おそらくアプリケーションプログラマとしては関係ありません。コアがメモリへのアクセスを共有する方法の微妙さに関係しています。

マルチコア(またはマルチプロセッサ)コンピューターを活用するには、並列で実行できるように記述されたプログラムと、複数のコアでプログラムを実際に並列で実行できるようにするランタイムが必要です(そしてオペレーティングシステム。ただし、PCで実行できるオペレーティングシステムであればすべて実行できます)。これは実際にはparallelプログラミングですが、パラレルプログラミングにはさまざまなアプローチがあります。 Pythonに関連するものは、マルチプロセッシングとマルチスレッドです。

C、C++、Java、C#などの言語では、複数のスレッドを実行して並列プログラムを作成できます。 CPythonおよびPyPyランタイムのグローバルインタープリターロックは、このオプションを排除します。ただし、それらのランタイムのみ。 (私の個人的な意見では、マルチスレッドは 危険で扱いにくい であり、一般的にはPython )

Pythonの複数のコアで実行できる並列プログラムを作成する場合、いくつかの異なるオプションがあります。

  • threading モジュールを使用してマルチスレッドプログラムを作成し、IronPythonまたはJythonランタイムで実行します。
  • processing モジュールを使用します(Python 2.6に multiprocessing モジュールとして含まれます)、一度に複数のプロセスでコードを実行します。
  • subprocess モジュールを使用して、複数のpythonインタープリターを実行し、それらの間で通信します。
  • Twisted および Ampoule を使用します。これには、異なるプロセスでコードを実行するだけでなく(ファイルなどへのアクセスを共有しない場合)異なるコンピューターでもコードを実行できるという利点があります。

これらのオプションのどれを選択しても、プログラムが実行している作業を分離する意味のあるチャンクに分割する方法を理解する必要があります。どんな種類のプログラムを書いているのかわからないので、有用な例を提供するのは難しいでしょう。

96
Glyph

別の投稿で述べたようにPython 2.6には multiprocessing モジュールがあり、複数のコア/プロセッサーを利用できます(複数のプロセスを透過的に開始することでGILを回避します)。スレッド化モジュールに似たいくつかのプリミティブを提供しています。

24
rslite

実際には、複数のプロセッサを使用するプログラムを作成できます。 GILロックのため、スレッドではできませんが、別のプロセスで行うことができます。どちらか:

  • subprocess モジュールを使用し、コードを分割してプロセッサーごとにプロセスを実行します
  • parallelpython モジュールを見てください
  • python> 2.6を使用する場合は、 multiprocess モジュールをご覧ください。
5
Mapad

Pythonでのマルチスレッド、および一般的なスレッドについて読むことができます。

Pythonでのマルチスレッド: http://www.devshed.com/c/a/Python/Basic-Threading-in-Python/

2
milot

物事を正しく理解していれば、PythonにはGIL(Global Interpreter Lock)と呼ばれるものがあり、Pythonで複数のスレッドを実行する際にマルチコアを効果的に利用できません。

たとえば、トピックに関するGuido van Rossumの ブログエントリ を参照してください。私の知る限り、「メインストリーム」言語の中で、C/C++とJavaのみがマルチコアを効果的にサポートしています。

2
lindelof

主な違いは、データの整理方法と配布方法です。通常、マルチコアはCPU内の異なるコア間でより高い帯域幅を持ち、マルチプロセッサはCPU間のバスをより多く使用する必要があります。

Python 2.6では、マルチプロセス(プログラム実行中のプロセス)と、マルチスレッドプログラミング用の同期および通信オブジェクトが増えています。

Python 2.6(たとえば、Ubuntu EdgyまたはIntrepidを使用している場合はそうではありません))がない場合は、 Googleコードバックポート を使用できますこれはPyPIの一部であり、EasyInstall(Ubuntuのpython-setuptoolsパッケージの一部)を使用して簡単にインストールできます。

0
Gert