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