2013-08-12 4 views
34

Pythonの普及しているRequestsライブラリは、ホームページ上でスレッドセーフであると言われていますが、詳細は記載されていません。私はrequests.session()を呼び出すと、私はその後、無事にそのような複数のスレッドにこのオブジェクトを渡すことができます。PythonのRequestsライブラリスレッドのセッションオブジェクトは安全ですか?

session = requests.session() 
for i in xrange(thread_count): 
    threading.Thread(
     target=target, 
     args=(session,), 
     kwargs={} 
    ) 

、複数のスレッドで同じ接続プールを使用して要求をしますか?

もしそうなら、これは推奨された方法ですか、それとも各スレッドに独自の接続プールを与えるべきですか? (すべての個々の接続プールの合計サイズを、上記のような1つの大きな接続プールのサイズに合計したと仮定します)。各アプローチの長所と短所は何ですか?

+0

どちらが良いかわかりましたか?私は現在、ほぼ同じ質問に走っています。私は1つの接続プール内のすべての要求にボトルネックがないように、各スレッドの新しいセッションを考えていました。 –

+0

@Marcel Wilson正確ではありません。セッションオブジェクトを使って何度も同じURLを要求していた私のプロジェクトでは、すべてのスレッドに同じセッションオブジェクトを送りましたが、アプリケーションはうまくいくように見えますが、より良いアプローチが何であるかまだ分かりません。しかし、私の問題は接続プールのボトルネックではなく、あまりにも多くの接続を開いたり、一度に多くのリクエストを送信したりすることでした。 – dg123

+0

リクエストはurllib3の上に構築されています。要求のスレッド安全性は、urllib3のスレッド安全性に大きく起因しています。これは、スレッドの安全性について詳しく説明しています。 – selllikesybok

答えて

17

requests.sessionのソースを確認した後、使用されているCookieJarの実装に応じて、セッションオブジェクトがスレッドセーフである可能性があります。

Session.prepare_requestself.cookiesから読み出し、Session.sendextract_cookies_to_jar(self.cookies, ...)を呼び出し、それがjar.extract_cookies(...)jarこの場合self.cookiesある)を呼び出します。

Python 2.7's cookielibのソースは、jarを更新している間にロック(threading.RLock)を取得するため、スレッドセーフであるようです。一方、documentation for cookielibにはスレッドセーフについては何も言われていないので、この機能に依存してはいけませんか?

UPDATE

あなたのスレッドがなど、などheadersproxiesstreamなどのセッションオブジェクトのすべての属性を変異またはmountメソッドを呼び出すか、with文でセッションを使用している場合は、そうではありませんスレッドセーフです。

関連する問題