問題タブ [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 投票する
1 に答える
2594 参照

python - Python スレッド コードをマルチプロセッシング コードに変換する方法は?

複数の理由 (GIL、メモリ リーク) でthreading、アプリケーションをアプリケーションに変換する必要があります。multiprocessing幸いなことに、スレッドは完全に分離されており、s を介してのみ通信しQueue.Queueます。このプリミティブは でも使用できるmultiprocessingため、すべて問題なく表示されます。さて、この地雷原に入る前に、今後の問題についてアドバイスをお願いしたいと思います。

  1. を介してオブジェクトを確実に転送するにはどうすればよいQueueですか? 提供する必要がありますか__setstate__
  2. putすぐに戻ることに頼ることはできますか( threading Queues のように)?
  3. 一般的なヒント/ヒント?
  4. Python ドキュメント以外に読む価値のあるものはありますか?
0 投票する
2 に答える
1082 参照

ruby - YARVのグローバルインタープリターロックを無効にすることは可能ですか?

これは他の何よりも好奇心が強いです(私はそれを完全に削除してjRubyを試す必要があります)が、YARVルビーのグローバルインタープリターロックと他の関連するロックを無効にすることは可能ですか?

YARV Rubyのライブラリの一部はスレッドセーフではないため、これは「保証が無効になる」と思いますが、他の問題が発生する可能性はありますか?

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

python - 複数のスレッドから NumPy の C API 関数を呼び出すことの意味は何ですか?

これはリスクの高いビジネスであり、Global Interpreter Lock が並列処理の恐るべき敵であることを理解しています。ただし、NumPy の C API (具体的PyArray_DATAには NumPy 配列のマクロ) を使用している場合、複数の同時スレッドから呼び出すと、潜在的な結果はありますか?

私は引き続き GIL を所有し、NumPy のスレッド サポートでリリースしないことに注意してください。また、NumPy がスレッド セーフを保証していなくてもPyArray_DATA、実際にはスレッド セーフであっても、それで十分です

LinuxでNumPy 1.3.0を使用してPython 2.6.6を実行しています。

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

python - PythonスレッドとGIL

私はGILについて読んでいましたが、これにメインスレッドが含まれるかどうかは実際には指定されていませんでした(私はそう思います)。私が尋ねる理由は、辞書を変更するスレッド設定のプログラムがあるからです。メインスレッドはプレーヤーの入力に基づいて追加/削除し、スレッドはデータの更新と変更をループします。

ただし、場合によっては、スレッドが辞書キーを繰り返し処理して、それらを削除できることがあります。いわゆるGILがあり、それらが順番に実行される場合、なぜdict変更エラーが発生するのですか?一度に1つだけ実行することが想定されている場合、技術的にはこれは発生しないはずです。

誰かがそのようなことに光を当てることができますか?ありがとうございました。

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

python - Pythonからグローバルインタプリタロックを取得する

Pythonコードからグローバルインタープリターロックを取得することは可能ですか?それとも、それは純粋にC側で実装されていますか?

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

python - メインの Python スレッドの PyThreadState* は NULL であると予想されますか?

他の Python スレッドが実行できるように、すべての Python ロックを解放したい C++ ライブラリを呼び出す Python プログラムがあります。

を使用するPyEval_SaveThreadPyEval_ReleaseThread、スレッドの状態が NULL であるというエラーが表示されます。

ただし、下位レベルの関数は NULL 状態を喜んで受け入れるようです。

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

python - CherryPyはベンチマークで60倍遅く、7つと比較して8つの要求スレッドがあります

を使用してPythonWebサーバーCherryPyをベンチマークする場合、(7つの同時スレッド)で1500リクエスト/秒(私が期待するものについて)をサーバーできるのはなぜですか?abしかし-c 7、それに変更する-c 8と、25リクエスト/秒に低下します。Python 2.6を実行している4つのコアを備えた64ビットWindowsマシンで、numthreads = 10でCherryPyを実行しています(ただし、numthreads = 8または20を使用しても違いはありません)。

Python GILが問題の一部であると半信半疑ですが、最大8つの同時要求スレッドを取得した場合にのみ発生する理由がわかりません。4コアのマシンでは-c 4、で変更される可能性があると思いますが、そうではありません。

web.pyに付属している1ファイルのCherryPyWebサーバーを使用しています。これが、テスト対象のWSGIアプリです。

ab7および8の並行スレッドの出力は次のとおりです。

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

python - ブロックしてPythonにコールバックする可能性のあるC関数の前にGILを解放することは可能ですか?

ブロッキング操作 (選択) を実行し、着信メッセージを処理する C 関数をラップしています。私の理解では、C 関数がブロックされる場合、他のスレッドの実行を許可しながらそれを呼び出す正しい方法は次のとおりです。

ただし、この関数がパラメーターとしてコールバック ポインターを受け取ることがあります。このコールバックは、C 関数によって前処理された受信メッセージを処理する際に呼び出されます。このコールバックを を呼び出す関数にラップすることに成功PyEval_CallObject()し、Python コールバックを渡すことができました。

スレッドのサポートを追加しているので、同時にできるかどうか疑問に思っています:

  • このブロッキング操作を呼び出す前に GIL を解放してください。
  • このブロッキング操作で安全に Python インタープリターにコールバックします。

これは問題を引き起こしますか?もしそうなら、それを回避する方法はありますか?

ありがとう。

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

python - インタープリター言語でグローバル インタープリター ロック (GIL) を使用しないようにするにはどうすればよいですか?

CPython はGlobal Interpreter Lockを使用します。Linux はBig Kernel Lockの痕跡をすべて取り除きました。これらのロックに代わるものは何ですか? すべてを停止させることなく、システムが真のマルチコアまたはマルチプロセッサ システムを最大限に活用するにはどうすればよいでしょうか?

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

python - サブインタープリターを破棄した後に GIL を解放する

C++ アプリケーションに Python 3.2 を埋め込んでおり、プログラム内でさまざまなタイミングで実行されるサブ インタープリターがいくつかあります (によって作成されPy_NewInterpreterます)。彼らはさまざまなタイミングで GIL を取得および解放しますが、サブ インタープリターの 1 つを破棄したいときに問題が発生しました。

サブインタープリターを破壊するには、GIL を取得する必要があります。だから私はこれを行います:

次に、インタプリタを破棄します

そして、GILを保持していたものが破壊されたので、GILを解放すると思うでしょう. ただし、ドキュメントにPy_EndInterpreterは次のように記載されています。

指定されたスレッド状態は、現在のスレッド状態でなければなりません。以下のスレッド状態の説明を参照してください。呼び出しが戻ると、現在のスレッドの状態は NULL です。(グローバル インタープリター ロックは、この関数を呼び出す前に保持する必要があり、関数が戻るときにも保持されます。)

したがって、サブインタープリターを破棄するときに GIL を保持する必要があり、サブインタープリターを破棄するとそれが NULL に設定され、GIL を取得したスレッドがそれを解放する必要がある場合、サブインタープリターを破棄した後に GIL を解放するにはどうすればよいですか? ?