2015-10-15 9 views
8

cPythonにはGILがあるので、マルチプロセッシングモジュールを使用せずに複数のコアでスクリプトを実行することはできません。しかし、複数のコアを使用してソートするなどの組み込み機能を停止するには何かがありますか?私はcPythonの構造を理解していませんが、私は 'GILの下のソートやリスト内包のような組み込み関数なのでしょうか?cPythonはsort、any、allなどの組み込み関数に複数のコアを使用しますか?

答えて

5

cPython GILは、単一のスレッドがプロセス内でバイトコードを実行できるようにするだけで、抽象化されていないCPUには関係しません。

今のところ、複数のプロセスをフォーク/使用するか、OS /ハードウェアがコールを受け取り、これを実行している(ほとんどありそうもない)場合を除き、すべての操作がシングルCPUコア。

Cで実装された組み込み関数は、基底のAPIへのより直接的な呼び出しであるため、「GILの下で」実行されますが、それらの関数に引数とデータを渡すことは、バイトコードを使用する読み書き。

ホストとのcPythonの関係をよりよく理解したい場合は、次のようなhigh-level official overviewおよび/またはthe PDF slides and the playground that I wrote for a conferenceをお勧めします。

+0

GILはバイトコードだけではありません。参照カウントはGILの下でのみ更新する必要があります。つまり、参照カウントを操作するものはGILを解放することができません。 'any'、' all'、 'sorted'は、バイトコードが必ずしも実行されていない場合であっても、参照カウントの操作が多く発生しているため、GILの下で完全に実行されます(例えば、' sorted'の場合比較もC層にある組み込み型)。リファレンスカウントを維持するために原子操作を使用するテストが行​​われており、CPythonは常に許容できないほど遅くなっています。 – ShadowRanger

+1

私はGIL _only_がバイトコードと関係しているとはっきりしていません - 私は質問の焦点をPythonの "フロントエンド"のsort/any/listに焦点を当てていました。それらに引数を渡すことはバイトコードで起こります。 –

+0

あなたはしませんでしたが、主な問題は 'sorted' /' any'/'all'をGILから解放することを妨げています(たとえ処理される項目が比較のためにバイトコードを実行しないことを保証できても、 、述語の適用など)。 OPの質問は、バイトコードとは何かではなく、パラレル化とGIL制限に関する能力に関するものでした。組み込み関数はバイトコード層の下にありますが、GILから解放されているわけではありません。なぜなら、バイトコードを実行しないことが保証されていても(それはできません)、PythonオブジェクトGILが必要です。 – ShadowRanger

2

自動的に並列化する機能はありません。一般に、スレッドを暗黙的に生成することは、ほとんどの言語では貧弱な形であると考えられています(これは変化していますが、純粋な関数型言語でしか見られません。警告を出さずにたくさんのスレッドを産み出すのは、ユーザーが自分のスレッドを起動しようとしたときに不思議なエラーが発生し、スレッドが多すぎるために一時的なエラーが発生する場合です。たとえGILが問題ではなかったとしても、これを行うことは意味がありません。つまり、GILはインタプリタ内部を保護するためのものであり、参照カウントが操作されている状況であれば常にカバーしています。まれに例外がありますが、PyObject*(これはすべてのPythonレベルの型がCのように表されています)で意味のある作業を行うことはできません。通常、Pythonの組み込み関数は、ブロック操作(I/O、ロック待ちなど)に対してのみGILを解放します。これらのケースでは、PyObjectを完全にCレベルのタイプに変換し、参照カウントや他の内部が触れられていないのでGILを解放するため、GILリリースが正常な第三者のC拡張(および​​)高価な作業、GILの再取得、そして結果をCレベルのタイプからPythonレベルのオブジェクトに変換します。

関連する問題