request.urlretrieve在多处理python中被卡住



我正在尝试使用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(?

相关内容

  • 没有找到相关文章

最新更新