Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python urllib2是否支持对需要基本身份验证的服务器执行线程?_Python_Multithreading_Urllib2 - Fatal编程技术网

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

Python urllib2是否支持对需要基本身份验证的服务器执行线程?,python,multithreading,urllib2,Python,Multithreading,Urllib2,我正在开发一个应用程序,它使用一系列REST调用来检索数据。我有完整的基本应用逻辑,数据检索的结构大致如下 1) 初始数据调用已完成 2) 对于初始调用中的每个响应,将对需要基本身份验证的rest服务执行后续数据调用 按顺序执行这些调用可能会增加最终用户很长的等待时间,因此我尝试实现线程化以加快进程(IO绑定使其成为线程化的理想选择)。问题是我在线程调用的身份验证方面遇到了问题 如果我按顺序执行调用,那么一切都可以正常工作,但是如果我使用线程方法进行设置,最终会出现401个身份验证错误或500个

我正在开发一个应用程序,它使用一系列REST调用来检索数据。我有完整的基本应用逻辑,数据检索的结构大致如下

1) 初始数据调用已完成

2) 对于初始调用中的每个响应,将对需要基本身份验证的rest服务执行后续数据调用

按顺序执行这些调用可能会增加最终用户很长的等待时间,因此我尝试实现线程化以加快进程(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()
有了它,你可以做这样的事情:

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
相关文档:


有了它,您可以执行以下操作:

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
相关文档:



您能发布您正在使用的代码吗?我已经在类似的任务中多次使用多处理,并且有一些示例代码,但是如果没有帮助,我不想发布它。Ignacio的可能重复,我看过这篇文章,并认为这是一个单独的主题,因为python中常见的线程示例是使用urllib2完成的,只要不包括身份验证,我就可以很好地处理urllib2。当需要身份验证时,我的问题更具体到线程urllib2的性质。然而,如果这被认为是一个副本,那么我道歉。你能发布你正在使用的代码吗?我已经在类似的任务中多次使用多处理,并且有一些示例代码,但是如果没有帮助,我不想发布它。Ignacio的可能重复,我看过这篇文章,并认为这是一个单独的主题,因为python中常见的线程示例是使用urllib2完成的,只要不包括身份验证,我就可以很好地处理urllib2。当需要身份验证时,我的问题更具体到线程urllib2的性质。但是,如果这被认为是一个副本,那么我很抱歉。我在不久前第一次编写此代码时(在重新访问它进行线程化之前)看到了请求,现在我又一次偶然发现了它。我将给它一个尝试,看看线程与它将工作。。。。尽管它有一个内置的异步功能这一事实也非常好。谢谢你的来信,没问题。我刚刚将它切换为使用
async.imap
而不是
async.map
。这样,您就得到了一个生成器,它在请求完成时为您提供请求,而不是在所有请求完成之前阻塞。我在不久前第一次编写此代码时(在重新访问它以进行线程化之前)看到了请求,而我现在又一次偶然发现了它。我将给它一个尝试,看看线程与它将工作。。。。尽管它有一个内置的异步功能这一事实也非常好。谢谢你的来信,没问题。我刚刚将它切换为使用
async.imap
而不是
async.map
。这样,您就得到了一个生成器,它在请求完成时为您提供请求,而不是在所有请求完成之前阻塞。