我正在尝试使用Python从URL列表中下载图像。为了使过程更快,我使用了多处理库。
我面临的问题是脚本通常悬挂/冻结,我不知道为什么。
这是我正在使用的代码
...
import multiprocessing as mp
def getImages(val):
#Dowload images
try:
url= # preprocess the url from the input val
local= #Filename Generation From Global Varables And Rand Stuffs...
urllib.request.urlretrieve(url,local)
print("DONE - " + url)
return 1
except Exception as e:
print("CAN'T DOWNLOAD - " + url )
return 0
if __name__ == '__main__':
files = "urls.txt"
lst = list(open(files))
lst = [l.replace("n", "") for l in lst]
pool = mp.Pool(processes=4)
res = pool.map(getImages, lst)
print ("tempw")
它通常会陷入列表的一半(它打印完成了,或者无法下载到已处理的列表的一半,但我不知道其余部分正在发生什么(。有人面对这个问题吗?我搜索了类似的问题(例如,此链接(,但没有找到答案。
预先感谢
好吧,我找到了答案。
可能的罪魁祸首是该脚本被卡在从URL连接/下载中。因此,我添加的是套接字超时以限制连接和下载图像的时间。
现在,这个问题不再困扰我。
这是我的完整代码
...
import multiprocessing as mp
import socket
# Set the default timeout in seconds
timeout = 20
socket.setdefaulttimeout(timeout)
def getImages(val):
#Dowload images
try:
url= # preprocess the url from the input val
local= #Filename Generation From Global Varables And Rand Stuffs...
urllib.request.urlretrieve(url,local)
print("DONE - " + url)
return 1
except Exception as e:
print("CAN'T DOWNLOAD - " + url )
return 0
if __name__ == '__main__':
files = "urls.txt"
lst = list(open(files))
lst = [l.replace("n", "") for l in lst]
pool = mp.Pool(processes=4)
res = pool.map(getImages, lst)
print ("tempw")
希望这种解决方案可以帮助面临同一问题的其他人
看起来您正在面对吉尔问题:python全局解释器锁基本上禁止python同时执行多个任务。Multiprocessing
模块确实在启动Python的单独实例以并行完成工作。
但是,在您的情况下,在所有这些情况下都调用了urllib:每个人都试图锁定IO过程:成功的一个(例如,先到先到先到(的人(例如,首先(为您带来结果,而其他人则(试图锁定已经锁定一个已经锁定一个锁定过程(失败。
这是一个非常简化的解释,但这里有一些加法:
您可以在此处找到另一种并行化请求的方法:使用Urllib2?
多处理以及有关GIL的更多信息:什么是全局解释器锁(GIL(?