問題タブ [python-multithreading]

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 に答える
1061 参照

python - ソケットスレッドとPyGTK

インスタントメッセージングプログラムを作成しようとしていますが、基本的なUIはほぼ完成しており、メッセージの受信部分を調べています。UIクラスとスレッド化されたReceive_Socketクラスがあります。Received_Socketクラスのソケットは、メッセージを受信するたびに、gobject.idle_add()を実行してUIメソッドを呼び出し、メッセージをチャットウィンドウに表示します。gobject.idle.add()行の後に、メッセージが実際にチャットウィンドウに表示されるまでループするwhileループがあります(gobject.idle_add()を読んだので、別のメッセージを受信する前にメッセージを表示したいです。実行順序を保証するものではありません。もちろん、メッセージを順番に表示したいです:))

私は自分のコードを要約しようとしました:

UIクラス:

スレッド化されたReceive_Socketクラス:

メインコード:

私の質問:

1)この種のコードは効率的ですか?それは(私のUIクラスと一緒にスレッド化された受信クラスを持つ)続行するための最良の方法ですか?

2)メッセージが表示されるまでに、ソケットは2つ以上のメッセージを受信して​​いる可能性があるため、message = sock.recv(1024)を再度実行すると、複数のメッセージが可変メッセージに連結されます。各メッセージにメッセージの長さを含めることを考えたので、1024バイトに複数のメッセージがある場合はメッセージを受け取り、残りをmessage_buffer変数に入れ、sock.recv(1024)を再度実行する前にチェックします。 message_buffer変数には何かが含まれている場合は、sock.recv(1024)の代わりにmessage_bufferをメッセージ変数に入れます。これを行うためのより簡単でより良い解決策はありますか?

前もって感謝します、

ノルヒアン

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

python - Matplotlib: 複数のスレッドでの同時プロット

大規模なバッチジョブをより迅速に完了するために、いくつかのプロットを並行して実行しようとしています。この目的のために、作成する予定のプロットごとにスレッドを開始します。

各スレッドがプロットを終了し、それ自体を閉じることを期待していました (私が理解しているように、Python は run() 内のすべてのステートメントを通過するとスレッドを閉じます)。以下は、この動作を示すコードです。

Figure を作成する行がコメント アウトされている場合、期待どおりに実行されます。もう 1 つの有益なヒントは、スレッドを 1 つだけ生成しても期待どおりに動作することです。

どんな助けでも正当に評価されます。

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

python - pingは実行できますが、Pythonプログラムを数時間実行すると参照できません

これは、Pythonで作成したGUIプログラムであり、XP SP3で実行されているWebサイト/サーバーのステータスをチェックします。マルチスレッドは、さまざまなサイト/サーバーをチェックするために使用されます。数時間実行すると、プログラムは常にurlopenエラーをタイムアウトし始めます。これは、サーバーからのPOSTリクエスト(特定のサーバーではなく、A、B、Cの可能性があります)の直後に常に発生します。問題を引き起こしている最初のPOSTリクエスト。通常、数時間実行した後、不明な時点でPOSTリクエストが発生します。それ以降は、urlopenエラーがタイムアウトするだけです。

プログラムが正常に終了すると、pingは実行できますが、サイトを参照できません。それは間違いなくこの問題を引き起こしているプログラムです、まあ私は問題が何であるかをデバッグ/チェックする方法がわかりません、またそれがOS側からのものか私のプログラムがあまりにも多くのリソース/接続を浪費しているのかわかりません(あなたはまだできますか?使用されている接続が多すぎる場合にpingを実行しますか?)、誰か助けてくれませんか?

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

python - Pythonスレッドとソケット

「理解したい」という質問があります。まず、Ubuntuでpython2.6.5を使用しています。

つまり、Pythonのスレッド(スレッドモジュール経由)は単なる「スレッド」であり、GILに特定の期間などに各「スレッド」からコードブロックを実行するように指示するだけです。実際にはありません。ここに実際のスレッドがあります。

したがって、問題は、1つのスレッドにブロッキングソケットがあり、データを送信して5秒間スレッドをブロックしている場合です。sock.sendスレッドをブロックしているのは1つのCコマンド()であるため、すべてのプログラムをブロックすることを期待していました。しかし、メインスレッドが引き続き実行されているのを見て驚いた。したがって、問題は、GILがsendなどのブロッキングコマンドに到達した後、残りのコードをどのように続行して実行できるかということです。ここでは本物の糸を使わなくてはいけませんか?

ありがとう。

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

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

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

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

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

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

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

ありがとう。

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

python - スレッドでロックを使用する賢明な小さなPythonの例

Pythonスレッドとロックを使用した賢明な(つまり、効率の点で本当に役立つはずの)例を探しています。私は多くの標準的な小さな例を知っていますが、それらはすべて、「小さい」、「賢明な」、または「ロックの使用」のプロパティの少なくとも1つを欠いています-例:

  • URLのリストをテストして可用性を確認します(賢明で小さいですが、ロックを使用しません)
  • いくつかのクライアント(スレッドごとに1つ)と変数(または銀行口座など)を保持するサーバーを実装する-小さい、ロックを使用しますが、賢明ではありません(実際にはこれを実装するためのより良い方法があります)。
  • スレッドを介した単純なアルゴリズムの並列化(大きなリストの合計など)-小さいですが、意味がなく(スレッドを介して並列化しないため)、ロックを使用しません。
0 投票する
2 に答える
286 参照

python - Python マルチスレッド拡張機能 - スレッド ロックの回復

Python 用のマルチスレッド C 拡張機能があります。3 つのスレッドを使用して Python のクラスにデータを出力します。

PyGILState_Ensure / PyGILState_Release API を使用してインタープリター呼び出しを同期しています。

拡張機能では、PyGILState_Release を呼び出す前に一部のスレッドがスタックして終了する可能性があります。

その無効な ThreadState を削除して、スレッド API を引き続き使用できる方法はありますか?

ありがとう

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

python - Python 2.1 でのスレッド化の使用例

Python 2.1 を使用してスレッド化を実装するのに助けが必要です。私はすぐに新しいバージョンの Python に更新しますが、残念ながら、私はビデオ ゲームに組み込まれたインタープリター内で作業しているので、2.1 は私にとって石で書かれています。明確にするために、「インポート スレッド」を使用せずにスレッドを実行する方法の例が必要です。「スレッドのインポート」は問題ありませんが、正しく機能させることができません。通常、新しいスレッドを生成しようとすると、ゲームがロックされるだけです。

または、誰かがこのコア「スレッド化」モジュールがどこにあるかを親切に説明してくれれば、それをソリューションに組み込むことができるかもしれません。なぜなら、そのモジュールの使用方法について読んだ例は非常に簡単に思えるからです。

ティア

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

python - スレッド対スレッディング

Pythonのthreadingとモジュールの違いは何ですか?thread

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

python - Python マルチプロセッシング: ファイルのようなオブジェクトの同期

確定的な出力を提供するために、テスト中に sys.stdout/sys.stderr に割り当てられることを意図したオブジェクトのようなファイルを作成しようとしています。高速であることを意図したものではなく、信頼性が高いだけです。これまでのところ、ほとんど機能していますが、最後のいくつかのエッジケースエラーを取り除くには、助けが必要です.

これが私の現在の実装です。

...そして簡単なテストスクリプト:

これは 95% の確率で完全に機能しますが、3 つの特殊な問題があります。これらを再現するには、テスト スクリプトを高速な while ループで実行する必要があります。

  1. 3% の確率で、親プロセスの出力が完全に反映されていません。これは、Queue-flushing スレッドが追いつく前にデータが消費されているためだと思います。デッドロックせずにスレッドを待つ方法はありません。
  2. .5% の確率で、multiprocess.Queue 実装からのトレースバックがあります。
  3. 0.01% の確率で、PID がラップアラウンドするため、PID でソートすると間違った順序になります。

最悪の場合 (確率: 7000 万分の 1)、出力は次のようになります。

python2.7 では、例外が少し異なります。

これらのエッジケースを取り除くにはどうすればよいですか?