問題タブ [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 - Python GIL を理解する - I/O バウンドと CPU バウンド
Pythonスレッドのドキュメントから
CPython では、グローバル インタープリター ロックにより、Python コードを一度に実行できるスレッドは 1 つだけです (パフォーマンス指向のライブラリによっては、この制限を克服できる場合もあります)。アプリケーションでマルチコア マシンの計算リソースをより有効に活用したい場合は、マルチプロセッシングを使用することをお勧めします。ただし、複数の I/O バウンド タスクを同時に実行する場合は、スレッド化が適切なモデルです。
今、私はこのようなスレッドワーカーを持っています
ここでw.analyze()
は2つのことをしています
requests
ライブラリを使用して URL をスクレイピングするpyv8
javascript ライブラリを使用してスクレイピングされた html を分析する
私の知る限り、1
I/O バウンドであり、2
CPU バウンドです。
それは、GIL が申請したのに2
、私のプログラムが正しく動作しないということですか?
python - マルチスレッドWebサーバーでのpython + wsgi:これは競合状態ですか?
wsgi を書いたとしますapplication
。このアプリケーションApache2
をLinux
マルチスレッドmod-wsgi
構成で実行して、アプリケーションが単一のプロセスごとに多くのスレッドで実行されるようにします。
アプリケーションコードは次のとおりです。
モジュール foo.py:
variable で競合状態を作成しましたa
か? 私は、スレッド間で存在し、同じ(共有されている)a
モジュールレベルの変数だと思いますか?foo.py
これから導き出されるより多くの理論的な質問:
- 同じプロセス内の同時スレッドが同じ
a
変数にアクセスして変更するため、私の例はスレッドセーフではありませんか? - 私のWeb
Apache
サーバーpthreads
がpthread
. それとも、Apache はこのエラーから私を保護してくれますか? Tornado
のようなpythonで書かれたWebサーバーでこれを実行していたらどうなりますHTTPServer
か?Python で記述された Web サーバーは、スレッドを Python レベルのthreading.Thread
オブジェクトとして実装application
し、各スレッドで関数を実行します。それで、それは競合状態だと思いますか?(また、この場合、実装の下の基礎となる C レベルから抽象化して、python 関数だけを心配することができると思いますpthreads
。threading.Thread
インタープリターは、C レベルの共有データを変更してその機能を台無しにすることを許可しないためです。したがって、私にとってスレッドセーフを破るのは、グローバル変数を扱うことですか?そうですか?)
python - GIL があるときに Python で競合状態にできますか?
私の理解では、cPython のグローバル インタープリター ロックにより、一度に実行できるスレッドは 1 つだけです。これは、失われた更新の問題などの競合状態から自動的に保護されますか?
明確にするために、私は理論的な観点から尋ねています。同期なしでスレッド化されたコードを書くことは決してありません。
python - Python C 拡張 OpenMP
独自の OpenMP C++ 拡張によって返される変数にアクセスしようとすると、Python インタープリターでセグメンテーション違反が発生します。
私が見つけたすべての解決策は、ctypesまたはcython(使用できません)のいずれかを使用しています。http://snatverk.blogspot.de/2012/03/c-parallel-modules-for-python.htmlは、OpenMP 対応の Python 拡張機能の小さな例を示しています。例のように for ループを実装しようとしましたが、まだ機能しません。
My Code 拡張コード関数は次のようになります。
関数 matcher_match() は、names と namesB の 2 つのリストを受け取ります。関数 test_pair_ij() によって示される特定の条件について、names と namesB (それらの float 属性) のすべての組み合わせをチェックします。この関数は、Python にコールバックしない純粋な C(++) 実装です。
C 拡張機能は次のように呼び出されます。
リスト名と名前 B がかなり小さい場合、コードは正常に実行されています。しかし、より大きなリストでは、Python コードで matchResult にアクセスできなくなりました。しようとすると、セグメンテーション違反が発生します(これはPythonインタープリターの内部にあると思います)。openmp を使用せずに C 拡張機能を再コンパイルしたところ、リストが大きくても問題なく動作しました。
問題は、拡張機能からアクセスする python 変数のメモリ内の混乱だと思います。これは GIL に関係している可能性がありますが、私はそれをリリースして取得しています。この場合、さらに変数をプライベートにする必要がありますか? これに関する他のアイデアはありますか?
EDIT : 関数 test_pair_ij の呼び出し引数を修正しました。
EDIT 2 : matchIdcs を保存するコードを修正
答え:
コードは GIL とPyList_SetItem(matchIdcs, i, matchVal);の呼び出しを解放していました。許可されていない python 構造を変更していました ( http://docs.cython.org/src/userguide/external_C_code.html#release-the-gilを参照)。
python - collections.deque "pop" メソッドは GIL をリリースしますか?
処理スレッドと監視スレッドがあるコードがあります。処理スレッドでは、collections.deque.popleft 関数を呼び出しています。popleft関数で処理関数がブロックされている場合でもモニタースレッドを実行したいので、この関数がGILを解放するかどうかを知りたかった
python - Python でのマルチスレッド: ほとんどの場合、本当にパフォーマンス効率が高いですか?
multi-threading
私のほとんどの理解では、すべてではありませんが、ほとんどの場合、プログラミングを推進するのはパフォーマンス要因です。(Java または Python に関係なく)。
SOでこの啓発的な記事を読んでいました。GIL
この記事では、python がGIL
メカニズムを採用していることを要約しています。つまり、いつでもsingle Thread
実行できるのは a だけです。python byte code
これにより、single thread
アプリケーションが非常に高速になります。
私の質問は次のとおりです。
Thread
特定の時点で1つしか提供されない場合、multiprocessing
またはthread
モジュールはGILによって課されたこの制限を克服する方法を提供しますか? multi-task
そうでない場合、実際の作業を行うためにどのような機能が提供されますか?
承認された回答の上記投稿のコメント欄に質問がありましたが、回答はありませんか? 私も心の中でこの疑問を持っていました
python - Python: スレッドを使用してジョブを処理する
かなり大きなマルチスレッドの python2 Web アプリケーションがあります。メイン スレッドではビジネス ロジックが動作し、サブスレッドでは主にデータベース操作が実行されます。TreadPoolExecutor は現在使用されておらず、近い将来に実装することはできません。特定の量のデータを処理する (高速) ことになっている別のスレッドを追加し、結果をデータベースに格納する (io 操作) ことを考えています。この操作は頻繁には実行されません。
問題は、ほとんどスリープ状態のスレッドを実行してイベントがデータを処理するのを待つべきか、それとも十分なデータがあるときにメインから新しいスレッドを生成し、処理が完了したら閉じる方がよいのでしょうか? GILがそれらを切り替えるために実行されているかなりの量のスレッドがすでにあることに注意してください。
ありがとう。
python - Python で複数のスレッドを持つ複数のプロセス
「並列アプリケーションから最大のパフォーマンスを得たい場合は、コンピューターの CPU と同じ数のプロセスを作成し、各プロセスでいくつかの (いくつの?) スレッドを作成する必要がある」という話を聞いたことがあります。
本当ですか?
このイディオムを実装するコードを書きました。
それが正しいか?私のdo_main_work
関数は実際に並行して実行され、GIL の問題に直面することはありませんか?
ありがとうございました。