4

したがって、https を使用してサーバーからの情報をリッスンするヘルパー スレッドがあります。Python の Requests.Session を使用し、タイムアウトなしで get() を呼び出しています。これは、応答を待ちたいためです。

ただし、シャットダウン時に、すべてのヘルパー スレッドを適切に終了したいと考えています。スレッドがブロックしている get リクエストを強制終了する方法がわかりません。*nix 環境では、セッションの基礎となるソケットを閉じると、例外がスローされます。これがこれを行う方法です。ソケットを閉じ、例外をキャッチして、満足してください。Windows では、これは機能しないようです。

私のヘルパースレッドが死ぬことができるように、セッションと get リクエストを強制終了/終了する正しい方法は何ですか?

明確化: Python の Requests.Session.get() を使用しています。

4

2 に答える 2

8

requests私が考えることができるすべてを調べた後、ソケットレベルまで完全に下がらなければ、飛行中の要求をキャンセルする方法がないように見えます。そして、OPが指摘したように、それでもWindowsで直接役立つことはありません。ただし、ソケットを閉じるだけでなく、基になるselect-or-poolループに実際に入る場合を除きます。(そして、Windowsを気にしないのであればsignal、スレッドを実行するだけで、より簡単に読み取りをキャンセルできます…)つまり、これで十分です。

1つの代替方法は、スレッドを強制終了するか、OSに自動的に実行させることです。スレッドが他の作業も行う場合は…まあ、いつでもそれを別のスレッドに分割できます。しかし、それはあなたのコードの大規模で不当な書き直しになる可能性があります。

だから、あきらめてrequests何か他のものを使う必要があるように思えます。

cURLライブラリには、リクエストをキャンセルする機能が確実にあります。と呼ばれる公式のバインディングのセットがありますpycurlが、それはよりもはるかに低レベルなので、 PyPIrequestsで検索して見つけることができる69105の高レベルのラッパーを調べることをお勧めします。それらのいくつかは完全ではない/安定していない/最新ではないので、おそらくあなたはあなたにぴったりのものを見つけるために少し遊んでみる必要があります…</ p>

于 2012-12-10T22:20:47.663 に答える