2

一連の REST 呼び出しを使用してデータを取得するアプリケーションを開発しています。基本的なアプリケーション ロジックが完成しました。データ取得の構造はおおまかに次のとおりです。

1) 初期データ呼び出しが完了する

2) 最初の呼び出しの応答ごとに、基本認証を必要とする残りのサービスに対して後続のデータ呼び出しが実行されます。

これらの呼び出しを順番に実行すると、エンド ユーザーの待機時間が長くなる可能性があるため、スレッド化を実装してプロセスを高速化しようとしています (IO バウンドであるため、これはスレッド化の理想的な候補になります)。問題は、スレッド化された呼び出しでの認証に問題があることです。

呼び出しを順番に実行すると、すべて正常に動作しますが、スレッド化されたアプローチで設定すると、サーバーから 401 認証エラーまたは 500 内部サーバー エラーが発生します。

REST サービス管理者と話しましたが、サーバー側で同じユーザーからの同時接続を妨げるものは何もないので、これが urllib2 側の問題かどうか疑問に思っています。

誰もこれについて経験がありますか?

編集:

正確なコードを投稿することはできませんが、非常によく似た構造で行っていることの合理的な表現を投稿します。

import threading
class UrlThread(threading.Thread):
    def __init__(self, data):
        threading.Thread.__init__(self)
        self.data = data

    def run(self):
        password_manager = urllib2.HTTPPasswordMgrWithDefaultRealm()
        password_manager.add_password(None, 'https://url/to/Rest_Svc/', 'uid', 'passwd')
        auth_manager = urllib2.HTTPBasicAuthHandler(password_manager)
        opener = urllib2.build_opener(auth_manager)
        urllib2.install_opener(opener)
        option = data[0]
        urlToOpen = 'https://url/to/Rest_Svc/?option='+option
        rawData = urllib2.urlopen(urlToOpen)
        wsData = rawData.readlines()
        if wsData:
            print('success')

#firstCallRows is a list of lists containing the data returned 
#from the initial call I mentioned earlier.
thread_list = []
for row in firstCallRows:
    t = UrlThread(row)
    t.setDaemon(True)
    t.start()
    thread_list.append(t)

for thread in thread_list:
    thread.join()
4

1 に答える 1

0

リクエストを使用すると、次のようなことができます。

from requests import session, async

auth = ('username', 'password')
url = 'http://example.com/api/'
options = ['foo1', 'foo2', 'foo3']

s = session(auth=auth)

rs = [async.get(url, params={'option': opt}, session=s) for opt in options]

responses = async.imap(rs)

for r in responses:
    print r.text

関連ドキュメント:
セッション
非同期リクエスト
基本認証

于 2012-04-13T15:24:54.853 に答える