私は自分のプロジェクトをC#から移植していますが、Pythonでマルチスレッドの問題を解決するのに問題があります。問題は長寿命のHTTP要求に関連しており、これは予期されています(要求はサーバーで特定のイベントが発生したときに応答します)。ここに要約があります:HTTPリクエストのクロススレッドを中止する
別のスレッドにurllib2
を使用してリクエストを送信します。要求が戻ったりタイムアウトすると、メインスレッドに通知されます。これは正常に動作します。しかし、この未処理のリクエストを中止し、別のURLに切り替える必要がある場合があります。私が検討できるソリューションは4つあります。
- 未解決の要求を中止します。 C#には
WebRequest.Abort()
がありますが、これをクロススレッドと呼び、リクエストを中止します。 Pythonurllib2.Request
は純粋なデータクラスであるように見えます。その場合、要求情報のみが格納されます。応答はRequestオブジェクトには接続されません。だから私はこれをすることはできません。 - スレッドを中断します。 C#には
Thread.Interrupt()
があり、待機状態または次回の状態になると、スレッド内でThreadInterruptedException
が発生します。 (モニタとファイル/ソケットI/Oの待機はどちらも待機状態です)。Pythonには匹敵するものはありません。 I/Oでブロックされているスレッドを起動する方法はありません。 - 要求のタイムアウトを低く設定します。タイムアウトになると、「中止」フラグをチェックします。 falseの場合は、要求を再開します。
- オプション3と同様に、状態オブジェクトに「aborted」フラグを追加すると、リクエストが最終的にいずれかの方法で終了すると、スレッドは応答が不要になったことを知り、ただシャットダウンします。
オプション3と4はPythonでサポートされている唯一のものですが、オプション3は恐ろしい解決策であり、4は必要のない接続を維持します。私はもはやそれを必要としないときに良いネチズンとこの接続を閉じることを望んでいます。未解決の要求を実際に中止する方法はありますか?
ありがとうございました。私はこれをもう一度書き直す必要があるので、これをバックバーナーに残しておきます。 (現在のところ、パフォーマンス上の理由からスレッドを使用していませんが、コードをシンプルにするため、GILはあまりにも苦労しません) – cdhowie
Geventはpythonのstdlib全体を非同期にパッチすることができます。使いやすい。しかし、確かにあなた自身の意思決定を単純化してください。 –
私は調査しており、これが最善のアプローチだと思われます。ポインタありがとう。 – cdhowie