問題タブ [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
ファイルの悪意のあるコードをスキャンするスクリプトを改善しようとしています。ファイルには正規表現パターンのリストがあり、各行に 1 つのパターンがあります。現在の実装は基本的に bash スクリプトの find\grep コンボであるため、これらの正規表現は grep 用です。私のベンチマーク ディレクトリでは、bash スクリプトに 358 秒かかります。これを 72 秒で実行する Python スクリプトを作成できましたが、さらに改善したいと考えています。最初にベースコードを投稿し、次に試した微調整を投稿します。
これは明らかにデバッグ\醜いコードです。100 万の queue.put(-1) は気にしないでください。後でクリーンアップします。特にscanFileで、いくつかのインデントが正しく表示されません。
とにかく気づいたことをいくつか。1、4、さらには 8 スレッド (xrange(0,???) のスキャナー用:) を使用しても違いはありません。それでも72秒以内です。これはpythonのGILによるものだと思います。
巨大な正規表現を作成するのではなく、各行 (パターン) を compilex RE としてリストに配置し、scanfile 関数でこのリストを反復処理してみました。これにより、実行時間が長くなりました。
PythonのGILを回避するために、次のように各スレッドをgrepにフォークさせてみました:
これにより、実行時間が長くなりました。
パフォーマンスを改善するための提案。
:::::::::::::編集::::::::
私自身の質問への回答はまだ投稿できませんが、提起されたいくつかの点に対する回答は次のとおりです。
@David Nehme - 人々に知らせるために、私は100万個のqueue.put(-1)を持っているという事実を認識しています
@Blender - キューの一番下をマークします。私のスキャナースレッドは、一番下にある-1に達するまでデキューを続けます(nextFileは-1ではありません:)。プロセッサ コアは 8 ですが、GIL が 1 スレッド、4 スレッド、または 8 スレッドを使用しているため、違いはありません。8 つのサブプロセスを生成すると、コードが大幅に遅くなりました (142 秒対 72 秒)
@ed-はい、それはfind\grepコンボと同じくらい遅く、実際には必要のないファイルを無差別にgrepするため遅くなります
@Ron - アップグレードできません。これはユニバーサルでなければなりません。これで 72 秒以上速くなると思いますか? bash grepper は 358 秒かかります。私の Python の巨大な RE メソッドは、1 ~ 8 スレッドで 72 秒かかります。8 スレッド (8 サブプロセス) の popen メソッドは 142 秒で実行されました。これまでのところ、巨大な RE python のみの方法が明らかに勝者です。
@intted
これが現在の find\grep コンボの要点です (私のスクリプトではありません)。とてもシンプルです。そこにはlsのような追加のものがありますが、5倍の速度低下を引き起こすものは何もありません. grep -r がわずかに効率的であっても、5x は非常に遅くなります。
Python コードの方が効率的です。理由はわかりませんが、実験的にテストしました。私はPythonでこれを行うことを好みます。私はすでにpythonで5倍のスピードアップを達成しました.もっとスピードアップしたいと思います.
:::::::::::::勝者 勝者 勝者:::::::::::::::::
勝者がいるようです。
intued のシェル スクリプトは 34 秒で 2 位になりましたが、@steveha は 24 秒で 1 位になりました。多くのボックスに python2.6 がないため、cx_freeze を使用する必要がありました。tar を wget して解凍するためのシェル スクリプト ラッパーを作成できます。ただし、単純にするために intued が好きです。
助けてくれてありがとう、システム管理のための効率的なツールを手に入れました
python - GILをリリースするための費用はいくらですか?
Pythonインタープリターから完全に独立した何かを行うC拡張関数があるとしましょう。GILをリリースしない理由はありますか?
たとえば、このようなコードを書かない理由はありますか(読みやすさやマイクロ最適化の回避などの問題は別として、重要ですが、私の質問にはあまり関係ありません)?
明らかに、これはパフォーマンスがそれほど重要ではない些細なコードです。しかし、ここでGILをリリースしないパフォーマンス上の理由はありますか?または、GILは、CPUを集中的に使用するコードに対してのみリリースする必要がありますか?
ruby - Ruby でマルチスレッドを並列に実行できますか?
マルチスレッドを並行して実行する方法があれば教えてください。私が今まで知っていることは、Ruby にはグローバル インタープリター ロックまたはグローバル VM ロックがあり、スレッドが並列に実行され、同時に実装されるのをブロックするということです。スレッドが並列または並行して動作していることを実際に理解し、検証するための詳細なスレッドの例をいくつか教えてください。
python - 並列スレッドによる Python 実行速度の向上
このサンプルコードがあるとしましょう:
スレッドを使用して、このコードの実行時間を改善したいと考えています (役に立てば幸いです)。物事をできるだけシンプルにしたいので、基本的にやりたいことは、同時に と を計算する 2 つのスレッドを作成することfoo1
ですfoo2
。
スレッドについて何か読んでいますが、少しトリッキーで、そのような単純なことをするためだけに時間を無駄にすることはできません。
python - boost::python とコールバック主導の実行
boost::python とコールバック駆動の実行を含むプロジェクトで問題が発生しています。
私のプロジェクトでは、C++ から Python コードを実行するためにコールバック メカニズムを使用しています。
コールバックの実行を引き起こす最初の関数呼び出しが Python インタープリターからのものである限り、すべて問題ありません。例えば:
残念ながら、それはそれほど単純ではありません。私のプロジェクトはRtAudioを使用してオーディオ環境と通信します。RtAudio の実行はコールバック駆動型です。RtAudio にコールバック関数を渡します。RtAudio を開始すると、サウンドの計算が必要になるたびにコールバックが呼び出されます。
RtAudio のコールバック駆動型実行を使用すると、コードが C++ から Python コールバックを実行しようとするとすぐにセグメンテーション違反が発生します。
コールバック駆動型の実行を開始するには、ノンブロッキングの関数 start() を呼び出す必要があります。これは、コールバック駆動の実行が別のスレッドで発生することを意味します。
次に、python から start() を呼び出すときに、python の実行環境に個別にアクセスする別のスレッドを作成しています。python の GIL を少ししか理解していないため、これは良くありません。
では、このコールバック駆動型スレッドで、すべてを分割せずに Python コールバックを実行するにはどうすればよいでしょうか?
申し訳ありませんが、私の問題の短い、完全に機能する例にコードを単純化する方法を見つけることができませんでした.問題はそこにあります.
編集
Python のドキュメントを調べた後、 Python以外で作成されたスレッドが Python 環境にアクセスしようとしたときに、スレッド セーフを処理するコードを数行追加しました。
しかし、私はまだセグメンテーション違反を起こします。だから私はvalgrindを通してそれを実行しました、そしてここに私が得たものがあります(valgrindが常にpythonインタープリターから取得する奇妙なものを差し引いたもので、これは「通常」です):
うまくいけば、コールバック関数は NULL ポインタにアクセスしようとしていますか?
編集2
わかりました、私はこれらすべてを発見しています。pthread のドキュメントから、セマフォsem_post(sem)
をsem
指す への呼び出しがあるようです。しかし、そこでは NULL を指しています。
さて、どうすればエラーをより正確に特定できますか?
python - Python スレッドが速いのはいつですか?
私たちは皆、 GILの恐ろしさを認識しており、モジュールを使用する適切な時期について多くの議論を見てきましたがmultiprocessing
、Python でスレッド化するとき (フォーカス主に CPython で) が正しい答えです。
GIL が重大なボトルネックにならない例は何ですか? スレッド化が最も適切な答えであるユースケースのタイプは何ですか?
python - h5py を別の HDF5 モジュールと一緒に使用するとデッドロックが発生する
pthreads と HDF5 を使用する Python 用の C++ モジュールを作成しています。私のモジュールは H5F_ACC_EXCL モードで HDF5 ファイルを作成するため、ファイルが既に存在する場合は失敗します。この場合、HDF5 はスタック トレースを出力します。このモジュールの Python C インターフェイス関数は 1 つのスレッドで実行され、ファイルの作成は別のスレッドで行われます。通常はすべて正常に動作しますが、モジュールを使用してスクリプトに h5py をインポートすると、システムがデッドロック状態になります。ファイルを作成しようとするスレッドには、次のバックトレースがあります。
[行 #7 は、モジュール内の関数について通知します] PyTables をインポートしても、この問題は発生しないことがわかりました。この問題を解決するための助けをいただければ幸いです。
python - Pythonのmath.factorialがスレッドでうまく機能しないのはなぜですか?
なぜmath.factorialはスレッドでそれほど奇妙に動作するのですか?
次に例を示します。3つのスレッドを作成します。
- しばらく眠るだけのスレッド
- しばらくの間intをインクリメントするスレッド
- 多数でmath.factorialを実行するスレッド。
start
スレッドを呼び出しjoin
、タイムアウトします
start
スリープスレッドとスピンスレッドは期待どおりに機能し、すぐに戻ってからjoin
、タイムアウトのために待機します。
一方、階乗スレッドはstart
、最後まで実行されるまで戻りません。
そして、CentOSx64でのPython2.6.5の出力は次のとおりです。
CentOSx64のpython2.6.5、Windows x86の2.7.2でこれを試しましたが、スレッドの実行が完了するまで、どちらの場合も階乗スレッドは最初から戻りません。
Windowsx86のPyPy1.8.0でもこれを試しましたが、結果が少し異なります。スタートはすぐに戻りますが、その後、参加はタイムアウトしません!
IronPython 2.7.1も試してみましたが、期待どおりの結果が得られます。
python - Pythonhttpサーバーを別のポートにルーティングする
ここにも古い同じ質問がありましたが、答えはスレッドの使用に関するものでした。GILでは大丈夫ではないと思いました。
さまざまなポートとさまざまなプロセスで実行されるさまざまなHTTPサーバー(Pythonでさえも)を作成したいと思います。そして、いくつかのパラメーター(HTTP_HOSTなど)を使用して、ポート80からそれらに要求をルーティングしたいと思います。
サーバー側(ルーター内)でHTTPクライアントを使用してポートへの要求を行う必要がありますか、それとも別の方法がありますか?
nginxのようなことをしたいのですが、動的に変更したいのです。