Python urllib2和线程

Python urllib2和线程,python,multithreading,urllib2,Python,Multithreading,Urllib2,Iam试图遵循中给出的多线程示例: 但我似乎得到了一个“线程错误”,我不知道这到底意味着什么 urlList=[list of urls to be fetched]*100 def read_url(url, queue): my_data=[] try: data = urllib2.urlopen(url,None,15).read() print('Fetched %s from %s' % (len(data), url)) my_data.append(d

Iam试图遵循中给出的多线程示例: 但我似乎得到了一个“线程错误”,我不知道这到底意味着什么

urlList=[list of urls to be fetched]*100
def read_url(url, queue):
 my_data=[]
 try:
    data = urllib2.urlopen(url,None,15).read()
    print('Fetched %s from %s' % (len(data), url))
    my_data.append(data)
    queue.put(data)
except HTTPError, e:
    data = urllib2.urlopen(url).read()
    print('Fetched %s from %s' % (len(data), url))
    my_data.append(data)
    queue.put(data)

def fetch_parallel():
    result = Queue.Queue()
    threads = [threading.Thread(target=read_url, args = (url,result)) for url in urlList]
    for t in threads:
      t.start()
    for t in threads:
      t.join()
    return result

res=[]  
res=fetch_parallel()
reslist = []
while not res.empty: reslist.append(res.get())
print (reslist)
我得到以下第一个错误:

Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/lib/python2.7/threading.py", line 552, in __bootstrap_inner
self.run()
File "/usr/lib/python2.7/threading.py", line 505, in run
self.__target(*self.__args, **self.__kwargs)
File "demo.py", line 76, in read_url
print('Fetched %s from %s' % (len(data), url))
TypeError: object of type 'instancemethod' has no len()
另一方面,我看到有时候,它似乎确实在获取数据,但随后我得到了以下第二个错误:

Traceback (most recent call last):
File "demo.py", line 89, in <module>
print str(res[0])
AttributeError: Queue instance has no attribute '__getitem__'
请注意。因此,你应该真正使用

有些问题与线程无关。线程只会使错误报告更加复杂。而不是

data = urllib2.urlopen(url).read
你想要

data = urllib2.urlopen(url).read()
#                               ^^
502坏网关
错误表示服务器配置错误(很可能是您连接的web服务的内部服务器正在重新启动/不可用)。你对此无能为力-现在无法访问URL。用于处理这些错误,例如,通过打印诊断消息,或安排在适当的等待时间后检索URL,或通过省略失败的数据集

要从队列中获取值,可以执行以下操作:

res = fetch_parallel()
reslist = []
while not res.empty():
  reslist.append(res.get_nowait()) # or get, doesn't matter here
print (reslist)
在URL确实无法访问的情况下,也无法绕过真正的错误处理。在某些情况下,简单地重新请求它可能会起作用,但您必须能够处理此时确实无法访问远程主机的情况。如何做到这一点取决于应用程序的逻辑。

请注意。因此,你应该真正使用

有些问题与线程无关。线程只会使错误报告更加复杂。而不是

data = urllib2.urlopen(url).read
你想要

data = urllib2.urlopen(url).read()
#                               ^^
502坏网关
错误表示服务器配置错误(很可能是您连接的web服务的内部服务器正在重新启动/不可用)。你对此无能为力-现在无法访问URL。用于处理这些错误,例如,通过打印诊断消息,或安排在适当的等待时间后检索URL,或通过省略失败的数据集

要从队列中获取值,可以执行以下操作:

res = fetch_parallel()
reslist = []
while not res.empty():
  reslist.append(res.get_nowait()) # or get, doesn't matter here
print (reslist)

在URL确实无法访问的情况下,也无法绕过真正的错误处理。在某些情况下,简单地重新请求它可能会起作用,但您必须能够处理此时确实无法访问远程主机的情况。如何做到这一点取决于应用程序的逻辑。

非常感谢。情况有所改善,但仍然会出现线程错误。我已经相应地更新了帖子。用502错误的信息更新了答案。如果你有更多(不相关的)错误,你应该提出一个新问题。这使得这个问题可以作为其他有类似问题的人的参考,并简化了答案?(对不起,我是线程新手)另外,如何将页面视为字符串?“打印分辨率[0]”是否不够?当我“打印分辨率”时,我得到了“如何查看更有用的表示?”?类似res[0]的东西?再次感谢您的建议和解决方法。@JohnJ try..except在
read\u url
中处理urllib2调用。通过输出
数据
,也可以在这里调试页面。由于队列是线程安全且性能优化的,因此您不能真正进入并读取整个队列。相反,打电话直到队列清空。谢谢。我理解try:catch-in-read\u-url函数。然而,我仍然无法从页面中看到任何“结果”。我看了“获取”手册,但我想它不是很清楚。我应该使用“queue.get_nowait()”吗?我想要的是结果以数组的形式出现,这样我就可以使用它进行进一步的处理。我应该在哪里实现queue.get()(或者)如何将url内容放入数组中?再次谢谢,谢谢。情况有所改善,但仍然会出现线程错误。我已经相应地更新了帖子。用502错误的信息更新了答案。如果你有更多(不相关的)错误,你应该提出一个新问题。这使得这个问题可以作为其他有类似问题的人的参考,并简化了答案?(对不起,我是线程新手)另外,如何将页面视为字符串?“打印分辨率[0]”是否不够?当我“打印分辨率”时,我得到了“如何查看更有用的表示?”?类似res[0]的东西?再次感谢您的建议和解决方法。@JohnJ try..except在
read\u url
中处理urllib2调用。通过输出
数据
,也可以在这里调试页面。由于队列是线程安全且性能优化的,因此您不能真正进入并读取整个队列。相反,打电话直到队列清空。谢谢。我理解try:catch-in-read\u-url函数。然而,我仍然无法从页面中看到任何“结果”。我看了“获取”手册,但我想它不是很清楚。我应该使用“queue.get_nowait()”吗?我想要的是结果以数组的形式出现,这样我就可以使用它进行进一步的处理。我应该在哪里实现queue.get()(或者)如何将url内容放入数组中?再次谢谢你,你检查过你的网关了吗?@Arafangion:我不知道我能用502错误做什么。我发布它的原因是因为我不确定它是否需要多线程。那么,你检查过你的网关了吗?@Arafangion:我不确定我能用502错误做什么。我之所以发布它,是因为我不确定它是否需要多线程处理。