urllib2是否支持线程到需要基本身份验证的服务器?

时间:2012-04-13 13:35:56

标签: python multithreading urllib2

我正在开发一个使用一系列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()

1 个答案:

答案 0 :(得分:0)

使用Requests,您可以执行以下操作:

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

相关文档:
Sessions
Asynchronous requests
Basic authentication