我想用Python3下载很多图片。我正在使用urllib.request.urlretrieve下载,并用socket.setdefaulttimeout设置超时,我想它不会输出超时错误,但是...
下面是我的代码
import threading
import socket
socket.setdefaulttimeout(60.0)
def multi_thread():
for file in self.url_list:
t = threading.Thread(target=fun, args=[file])
threads_task.append(t)
for task in threads_task:
task.start()
for task in threads_task:
def fun():
try:
urllib.request.urlretrieve(url, file_name)
except Exception as e:
print(e)错误:
HTTP Error 502: Bad Gateway
HTTP Error 502: Bad Gateway
HTTP Error 502: Bad Gateway
HTTP Error 502: Bad Gateway
HTTP Error 502: Bad Gateway
<urlopen error [WinError 10060]
<urlopen error [WinError 10060]
<urlopen error [WinError 10060]问题是我用代码下载了10张图片,效果很好。但是1000+图像,太多的时间out.maybe上百次超时。
然后我改变了主意,放弃了多线程,一个接一个地下载图片,效果很好,只有两个超时错误。
那么我该如何处理它呢?真的需要你的help.Thanks。
发布于 2016-03-09 22:17:04
问题不在于您的线程数量。对于1000+文件,您正在运行1000+并发线程,这会导致目标服务器过载。您需要限制并发线程。你可以通过multiprocessing.Pool来做这件事。
from multiprocessing import Pool
import socket
socket.setdefaulttimeout(60.0)
def multi_thread():
pool = Pool(processes=4) # 4 concurrent processes/threads
pool.map(fun, self.url_list) # apply method 'fun' to all the items in 'self.url_list'
def fun(file):
url, filename = file.url, file.filename
try:
urllib.request.urlretrieve(url, file_name)
except Exception as e:
print(e)这样,您的所有1000+文件将在多个线程/子进程中下载,但只有4个并发线程。
https://stackoverflow.com/questions/35893878
复制相似问题