問題タブ [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.

0 投票する
2 に答える
599 参照

python - Python GIL とグローバル

Python では、さまざまなスレッドによって読み取り/インクリメントされるグローバル変数が定義されています。GIL が原因で、ロック機構を使用しなくても問題が発生することはありますか?

0 投票する
3 に答える
754 参照

python - Python-`multiprocess`の同時使用に関する質問

Pythonのマルチプロセッシングを使用して、ロックを使用せずに並行処理を実行したい(ロックはマルチプロセッシングの反対です)。Webリクエスト中に異なるリソースから複数のレポートを同時に作成したいからです(通常は約3秒かかりますがマルチプロセッシングを使用すると、0.5秒で実行できます)。

私の問題は、そのような機能をWebに公開し、10人のユーザーが同時に同じレポートを取得すると、突然60人のインタープリターが同時に開いてしまうことです(システムがクラッシュします)。これはマルチプロセッシングを使用した常識的な結果ですか、それともこの潜在的な悪夢を回避するためのトリックがありますか?

ありがとう

0 投票する
2 に答える
2767 参照

python - Pythonスレッドが共有状態を安全に操作できる場合がありますか?

別の質問でのいくつかの議論は、マルチスレッドPythonプログラムでロックが必要な場合をよりよく理解するように私を促しました。

Pythonでのスレッド化に関するこの記事によると、複数のスレッドが共有状態にアクセスするときに発生する可能性のある落とし穴の確かでテスト可能な例がいくつかあります。このページで提供されている競合状態の例には、辞書に格納されている共有変数を読み取って操作するスレッド間の競合が含まれます。ここでのレースのケースは非常に明白であり、幸いにも非常にテスト可能だと思います。

ただし、リストの追加や変数の増分などの不可分操作で競合状態を引き起こすことはできませんでした。このテストは、そのようなレースを徹底的に実証しようとします。

上記のテストを失敗することなく実行しました(100x 100kマルチスレッド追加)。誰かがそれを失敗させることができますか?スレッドによるアトミック、インクリメンタル、変更を介して誤動作させることができる別のクラスのオブジェクトはありますか?

これらの暗黙の「アトミック」セマンティクスは、Pythonの他の操作に適用されますか?これはGILに直接関係していますか?

0 投票する
4 に答える
734 参照

python - Python: GIL なしでいくつかのデータ (matplotlib) をプロットする

私の問題はもちろんGILです。データを分析している間、間にいくつかのプロットを表示するといいでしょう (結果を待つのが退屈ではありません)。

しかし、GIL はこれを防ぎます (そして、そもそも Python がそんなに良い考えだったのかと自問自答するところまで来ています)。

プロットを表示することしかできず、ユーザーが閉じてから計算を開始するまで待ちます。明らかに時間の無駄。

サブプロセス モジュールとマルチプロセッシング モジュールは既に試しましたが、うまく動作しないようです。

これについて何か考えはありますか?ありがとう

編集:わかりましたので、GILではなくshow()です。

0 投票する
1 に答える
836 参照

c++ - スレッドを使用してPythonで複数のC++関数を呼び出す

整数を取るC(++)関数があり、それがpython apiで(C)pythonにバインドされているとすると、pythonから呼び出すことができます。

今、私はそれを並列化したいです。問題は、この場合、GILはどのように機能するかということです。処理する番号のキューがあり、一部のワーカー(threading.Thread)が並行して作業していて、それぞれがキューから取得されたc_module.f(number)場所numberを呼び出しているとします。

GILがインタプリタをロックする通常の場合との違いは、c_module.fコンパイルされているため、インタプリタを評価する必要がないことです。したがって、問題は次のとおりです。この場合、処理は本当に並列ですか?

0 投票する
5 に答える
5298 参照

python - Python のマルチスレッド クローラーは本当に速度を上げますか?

Python で小さな Web クローラーを作成しようとしていました。マルチスレッド スクリプトとして記述し、スレッドの 1 つのプールをダウンロードし、1 つのプールで結果を処理することを調査し始めていました。GILが原因で、実際に同時ダウンロードを行うのでしょうか? GIL は Web クローラーにどのように影響しますか? 各スレッドは、ソケットからデータを取得してから、次のスレッドに移動し、ソケットからデータを取得するなど..?

基本的に、Pythonでマルチスレッドクローラーを実行することで、シングルスレッドと比べて多くのパフォーマンスが得られるのでしょうか?

ありがとう!

0 投票する
2 に答える
2561 参照

python - Python には GIL が必要です。しかし、Jython と IronPython はそうではありません。なんで?

GIL を必要とせずに Jython と IronPython を実行できるのに、Python (CPython) には GIL が必要なのはなぜですか?

0 投票する
5 に答える
871 参照

java - GIL を使用しない強力な明示的な型付け言語を探している

C++ のような静的型チェック機能を備え、Python のような最新の構文を使用し、GIL を持たない言語はありますか?

私は、各変数の型を明示的に宣言する機能を備えた Python 3 が「ほぼ存在する」と信じていますが、GIL は私を悲しくさせます。

Java は素晴らしいですが、かさばる JRE を使わずに、もっと「埋め込み可能」なものが必要です。

更新: .NET 関連または非オープン ソースは禁止されています。

Update2:開発速度を犠牲にしてより安全なコードを記述するには、明示的かつ厳密な型指定が必要です。コードは非常に広範囲に計算され、マルチコアサーバーで実行されるため、GIL は重要です。そのため、複数の CPU を効果的に使用する必要があります。

Update3:ターゲット プラットフォームは x86 上の Linux (Debian) です。

0 投票する
1 に答える
747 参照

python - 適切なチェック間隔を決定するにはどうすればよいですか?

CPU に問題があるトルネード アプリケーションの作業を開始したところです。CPU 時間は時間の経過とともに単調に増加し、CPU は 100% で最大になります。システムは現在、メイン スレッドをブロックしないように設計されています。ブロックする何かを実行する必要があり、非同期ドライバーが使用できない場合は、別のスレッドを生成してブロック操作を実行します。

したがって、ほぼ完全に CPU バウンドのメイン スレッドと、ほぼ完全に IO バウンドの他のスレッドの束があります。私が読んだことから、これは GIL で問題に遭遇する完璧な方法のようです。さらに、私のプロファイリングは、シグナルの待機に多くの時間を費やしていることを示しています (これは、私__semwait_signalが行っていることであると想定しています)。

チェックsys.setcheckinterval間隔を 300 に設定すると、CPU の成長が大幅に遅くなります。私が判断しようとしているのは、チェック間隔を増やすべきか、300 のままにしておくべきか、それとも怖がって増やすべきかということです。結局、CPU のパフォーマンスが向上していることに気付きますが、これがシステムの応答性に悪影響を与えるのではないかと少し心配です。

もちろん、正しい答えはおそらく、GIL を考慮してアーキテクチャを再考する必要があるということです。しかし、それはすぐにできることではありません。では、短期的に取るべき適切な行動方針をどのように決定すればよいのでしょうか?

0 投票する
6 に答える
1497 参照

c# - C# の GIL のバージョンは何ですか?

CPython の現在の実装には、「GIL」または「Global Interpreter Lock」と呼ばれるオブジェクトがあります。これは基本的に、2 つの Python スレッドが同時に Python コードを実行するのを防ぐミューテックスです。これにより、2 つのスレッドが Python インタープリターの状態を破壊することを防ぎますが、複数のスレッドが実際に一緒に実行されることも防ぎます。基本的に、これを行うと:

リストを壊すことはできません。なぜなら、実行するスレッドは GIL を保持している必要があるためです。ここで、リスト内の項目が不定の順序で追加される可能性がありますが、ポイントは、リストが破損していないことであり、常に 2 つのものが追加されます。

では、C# に移ります。C# は基本的に Python と同じ問題に直面しています。誰かがそれを知っているなら、私はJavaの話を聞くことにも興味があります.


明確化:特に VM に対して、明示的なロック ステートメントなしで何が起こるかに興味があります。Java と C# の両方にロック プリミティブが存在することは承知しています。それらは Python にも存在します。GIL は、インタープリターを正常に保つ以外に、マルチスレッド コードには使用されません。上記の直接の同等物に興味があるので、十分に覚えていれば、C# で... :-)

別の例を次に示します。

私は悪い C# コードを書くつもりはありませんlock。ステートメントを理解しています。Python でも、GIL は魔法のようなマルチスレッド コードを提供しません。共有リソースをロックする必要があります。しかし、GIL は Python の「VM」が破損するのを防ぎます。私が興味を持っているのはこの動作です。