web-dev-qa-db-ja.com

単一コアマシンでマルチプロセッシングPythonプログラムを実行できますか?

したがって、これは多かれ少なかれ理論的な問題です。私はおそらく強力なシングルコアマシンを持っていますが、それでもコアは1つだけです。今、私は2つの選択肢があります:

  1. マルチスレッディング:私の知る限り、GILのために複数のコアがあったとしても、マシンで複数のコアを使用することはできません。したがって、この状況では、違いはありません。

  2. マルチプロセッシング:これは私が疑うところです。シングルコアマシンでマルチプロセッシングを実行できますか?または、マシンで使用可能なコアを確認して、まったく同じ数または少ない数のプロセスを実行する必要があるたびに、

誰かがマシンのマルチプロセッシングとコアの関係について私を案内してくれませんか?.

私はこれが理論的な質問であることを知っていますが、私の概念はこれについてあまり明確ではありません。

12
user1867151

これは大きなトピックですが、ここにいくつかの指針があります。

  • スレッドは、同じアドレス空間を共有し、同じメモリにアクセスできるプロセスと考えてください。通信はシェア変数によって行われます。同じプロセス内で複数のスレッドを実行できます。
  • プロセス(このコンテキストでは、おおまかに言えば)には独自のプライベートデータがあり、2つのプロセスが通信したい場合、その通信はより明示的に行われる必要があります。
  • ボトルネックがCPUサイクルであるプログラムを作成している場合、単一のコアマシンではスレッドもプロセスも高速化されません。
  • プロセスとスレッドは引き続きマルチタスク((サブ)プログラム間の迅速な切り替え)に役立ちます。これは、コアよりもはるかに多くのプロセスを実行するため、オペレーティングシステムが行うことです。
  • プロセスとスレッド(またはコルーチンも!)は、実行中のタスクがI/Oバウンドの場合、シングルコアマシンでもかなり高速化できます。ネットワークからデータをフェッチすることを考えてください。たとえば、データの送信または到着をアクティブに待機する代わりに、別のプロセスまたはスレッドが次のネットワーク操作を開始できます。
  • オーバーヘッドが低いため明示的なカプセル化が不要な場合、スレッドはプロセスよりも望ましい方法です。ほとんどのCPUバウンドの同時問題、特に " embarassingly parallel "の大きなサブセットでは、プロセッサより多くのプロセスを生成することはあまり意味がありません。
  • Python GILは、同じプロセス内の2つのスレッドが並列に実行されることを防ぎます。つまり、複数のコアが文字通り同時に命令を実行することを防ぎます。
  • したがって、Python=のスレッドは、CPUにバインドされたタスクの高速化には比較的役に立ちませんが、ブロック操作(ネットワークデータの待機など)がGILを解放するため、I/Oにバインドされたタスクには非常に役立ちます。別のスレッドが待機している間に別のスレッドを実行できるようにします。
  • 複数のプロセッサがある場合、GILに関係なく複数のプロセスを生成することにより、真の並列処理を実現できます。これは、CPUにバインドされたタスクに対してのみ価値があり、多くの場合、プロセスの生成のオーバーヘッドとプロセス間の通信コストを考慮する必要があります。
3
timgeb

シングルコアシステムでは、マルチスレッドとマルチプロセッシングの両方を使用できます。

GILは、基盤となるアーキテクチャーに関係なく、純粋にPython=計算にバインドされたタスクでのマルチスレッドの有用性を制限します。I/ Oにバインドされたタスクの場合、それらは完全に正常に機能します。おそらく、そもそもそれらは実装されていなかっただろう。

純粋なPythonソフトウェアの場合、並列計算に関しては、マルチプロセッシングが常に安全な選択です。もちろん、複数のプロセスは複数のスレッドよりもコストがかかります(スレッドとは対照的に、プロセスはメモリを共有しないためです。また、プロセスには、スレッドと比較してわずかに高いオーバーヘッドが伴います。

ただし、シングルプロセッサマシンの場合、マルチプロセッシング(およびマルチスレッディング)を使用すると、計算量の多いタスクの速度がほとんどまたはまったく向上せず、実際には少し遅くなります。ただし、OSがそれらをサポートしている場合(デスクトップ、ワークステーション、クラスターなどでは一般的ですが、組み込みシステムでは一般的ではない場合があります)、複数のI/Oバインドプログラムを同時に効率的に実行できます。

簡単に言えば、それはあなたがやっていることに少し依存します...

2
norok2

multiprocessing モジュールは基本的にpythonインタプリタの複数のインスタンスを生成するため、GILの心配はありません。

マルチプロセッシングは、以前に使用したことがある場合、 threading モジュールで使用されるものと同じAPIを使用します。


マルチプロセッシング、スレッド化(マルチスレッド化と呼びます)とXコアプロセッサの間で混乱しているようです。

  • 何があっても、起動時にPython(CPython implementation)は、プロセッサの1つのコアのみを使用します。
  • スレッディングは、スクリプトの異なるコンポーネント間で負荷を分散しています。外部APIとやり取りする必要があるとすると、スクリプトは、次に進むまで通信が完了するのを待たなければなりません。同じような呼び出しを複数行っているため、線形時間がかかります。一方、スレッドを使用する場合は、それらの呼び出しを並行して行うことができます。

参照: PythonのPyPy実装

1
Santosh Kumar