問題タブ [gil]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - GIL 関連と思われるロックの問題をトラブルシューティング/バイパスする方法
2 つのスレッド間のあいまいなロックアップは、グローバル インタープリター ロックまたはその他の「舞台裏のロック」に関連しているようで、トラブルシューティングを続行する方法がわかりません。ロックアップを解消するためのヒントをいただければ幸いです。
この問題は、より大きなコード セットで再現されます (不規則かつランダムに発生します)。コードは厳密に python です。Python のバージョンは 2.6.5 (Linux 上) です。何時間ものトラブルシューティングにより、ロックアップが発生したときの問題が次のように軽減されました。
- プログラムには実行中のスレッドが 2 つしかありません
- スレッドは、単一のスレッド化によって保護されたメソッドを同時に呼び出します.RLock
- スレッド 1 は、acquire() を介してロック [およびその他のロック] を取得しました
- スレッド 2 は acquire() を呼び出しており、ロックを待機していることが確認されています
- スレッド 1 は、print() を使用してコンソールに出力できますが、単純なノンブロッキング ライブラリ呼び出しによってロックされています。
#5 の攻撃的な呼び出しは関数 unicode.encode であり、これはノンブロッキングでなければなりません。スレッドがロックする位置のスレッド 1 の次のコードは、(予想どおり) 'A' と 'B' を出力します。
ただし、次の例では「A」のみが出力され、スレッドがブロックされます。
これは私にはまったく意味がありません。2 つのスレッド間に論理的なデッドロック状態はありません。スレッド 1 は、RLock の取得を黙って待機しているスレッド 2 にまったく干渉しないノンブロッキング ライブラリ呼び出しによってブロックされています。スレッド 1 がブロックされている唯一の原因は、スレッド 1 が GIL を待っていることです。
これをさらにトラブルシューティングする方法、または回避策として GIL 操作を制御または操作するメカニズムはありますか?
編集: samplebias に対応する追加情報 (および返信ありがとうございます)。この問題は、2 つのスレッド間のタイミングを乱す可能性のあるものに非常に敏感であるように思われるため、トレースの取得に問題がありました。ただし、-f オプションのみを指定して strace を実行すると、数回繰り返した後、トレースを取得できました。
スレッド 1 には、「CHECK_IN」と「CHECK_TEST」の 2 行をコンソールに出力する必要がある次の 3 つのデバッグ ステートメントが含まれています。
strace の最後のページは次のとおりです。
プログラムがロックする前の 3 行のコードの出力は、次のとおりです。
したがって、strace は、スレッド 1 (#8606) が 'CHECK_IN' 文字列を書き込む方法を示しており、unicode.encode 呼び出しに到達すると、決して返されない待機状態になります。
ところで、私はすべてのモジュールでいくつかの将来のインポートを作成して、いくつかの新しい Python 規則を維持しています ...
...しかし、特にu'hello'文字列がUnicode文字列として明示的に呼び出されているため、それらが違いを生むはずがありません。
python - numpy とグローバル インタープリター ロック
ほとんどの時間をnumpy
の線形代数関数内で費やすことになる計算集約型の Python コードを書き込もうとしています。
当面の問題は、恥ずかしいほど並列です。簡単に言えば、それを利用する最も簡単な方法は、複数のスレッドを使用することです。主な障壁はほぼ確実に Global Interpreter Lock (GIL) です。
これを設計するのに役立つように、numpy
操作がその期間中に GIL を解放することが期待できるメンタル モデルがあると便利です。この目的のために、経験則、すべきこととすべきでないこと、ポインタなどをいただければ幸いです。
念のため、 Linux で 64 ビットの Python 2.7.1 を使用しています。1.5.1numpy
とscipy
0.9.0rc2 を使用し、Intel MKL 10.3.1 でビルドされています。
python - 1 つのスレッドでビジーなタスクを実行すると、すべてのスレッドがハングする
さまざまなタスクを実行するためにスレッドが生成されるマルチスレッドの Python アプリケーションがあります。このアプリケーションは何ヶ月もうまく機能していますが、最近問題が発生しました。
スレッドの 1 つは、集中的なデータ コピー コマンドを実行している Pythonsubprocess.Popen
オブジェクトを開始します。
copy コマンドが実行されている間、アプリケーション全体が最終的に停止し、他のスレッドが一度に数分間実行されることはありません。終了するとcopy
、中断したところからすべてが再開されます。
これが起こらないようにする方法を見つけようとしています。私の最良の理論は、ATM は、カーネルがプロセスをスケジューリングする方法に関係しているということです。setsid()
メインの Python アプリとは別にスケジュールされたコピー プロセスを取得するための呼び出しを追加しましたが、これは効果がありません。
copy.wait()
関数が行うことはすべてwaitpid()
. その1つのスレッドがGILを保持している間、呼び出しに時間がかかる可能性はありますか? もしそうなら、どうすればこれを防止/対処できますか? これをさらにデバッグするにはどうすればよいですか?
java - Python が Java よりもマルチプロセッシングまたはマルチスレッド アプリケーションに優れていないのはなぜですか?
Python には GIL に関するいくつかの問題があるため、Java はマルチプロセッシング アプリケーションの開発に適しています。Python よりも Java の方が処理が効率的であることの正確な理由を説明していただけますか?
python - GILed Python プログラムを単一の CPU に制限すると、パフォーマンスが向上しますか?
Python と GIL に関するDavid Beazley の論文をフォローアップすると、Windows ベースのマルチコア システムで Python プログラム (GIL を使用した CPython など) を 1 つの CPU に制限するのは良い方法でしょうか?
パフォーマンスが向上しますか?
更新: 複数のスレッドが使用されていると仮定します(違いがあるかどうかはわかりません)
python - マルチプロセッシングはurllib2では役に立たない?
私は最近、小さなツール (urllib2 を使用して (非公式)twitter-button-count-url (> 2000 URL) にリクエストを送信し、その結果を解析する) をマルチプロセッシング モジュール (およびそれのワーカープール)。ここで、マルチスレッド (標準の非スレッド バージョンと比較して全体が遅くなる) とマルチプロセッシングに関するいくつかの議論を読みましたが、(おそらく非常に単純な) 質問に対する答えを見つけることができませんでした。
マルチプロセッシングで URL 呼び出しを高速化できますか、それともネットワーク アダプターのようなボトルネックではありませんか? たとえば、urllib2-open-method のどの部分を並列化できるのか、どのように機能するのかわかりません...
編集:これは私がスピードアップしたいリクエストと現在のマルチプロセッシングセットアップです:
python - Python GIL とスレッドの同期
Python の GIS とスレッドを説明するさまざまな記事を読んだ後、GIL のためにマルチスレッドの Python コードではロックは不要ですか? これは非常に役立つ回答です。「最後の質問」が 1 つあります。
理想的には、スレッドがアトミック (Python VM) 命令を介して共有データのみを操作する場合、たとえば、リストにアイテムを追加する場合、ロックは必要ありませんよね?
python - Pythonで複数のスレッドを同時に実行する-それは可能ですか?
URLを複数回フェッチする必要がある小さなクローラーを作成しています。すべてのスレッドを同時に(同時に)実行する必要があります。
私はそれを行うべき小さなコードを書きました。
apacheログからは、スレッドが同時に実行されているようには見えません。リクエスト間に少しギャップがあり、ほとんど検出できませんが、スレッドが実際には並列ではないことがわかります。
GILについて読んだことがありますが、C \ C ++コードを呼び出さずにGILをバイパスする方法はありますか?GILでどのようにスレッド化が可能か本当に理解できませんか?Pythonは基本的に、前のスレッドで終了するとすぐに次のスレッドを解釈しますか?
ありがとう。
python - Python3.2以降のsys.setswitchinterval
Python 3.2では、関数を公開するAntoinePitrouによる新しいGIL実装sys.setswitchinterval
が導入されました。
これを変更すると便利なのはいつですか。その理由は何ですか。
python - pythonグローバルインタープリターロックGILの問題
Pythonで記述され、Linuxマシンで実行されているアルゴのパフォーマンスをテストできるサービスをWeb上で提供したいと思います。
基本的に私がやりたいのは、非常に些細なPHPハンドラーがあることです。たとえば、ブラウザーからの要求を受け入れるstart_algo.phpがあり、phpコードにはsystem()またはpopen()(exec( " python algo.py "))pythonスクリプトを実行する新しいプロセスを発行するには、この部分で実行可能だと思います
問題は、それがWebサービスであるため、確かに同時に複数のユーザーにサービスを提供する必要があるということですが、Global Interpreter LockGILhttp://wiki.python.org/moin/GlobalInterpreterLockによってかなり混乱しています 。 'CPythonが実装されました。つまり、現在3人のユーザーがアルゴを実行している場合(つまり、3つの別々のプロセス、間違っている場合は修正してください)、特定の瞬間に、Pythonがサービスを提供しているユーザーは1人だけです。通訳と他の2人は順番を待っていますか?
よろしくお願いします
テッド