多个urllib2连接

2 投票
2 回答
1348 浏览
提问于 2025-04-16 06:49

我想同时下载多张图片。为此,我使用了线程,每个线程负责下载一张图片,使用的是urllib2模块。我的问题是,尽管线程几乎同时启动,但图片还是一个接一个地下载,就像在单线程环境中一样。

这是我使用的线程函数:

def updateIcon(self, iter, imageurl):
    req = urllib2.Request('http://site.com/' + imageurl)
    response = urllib2.urlopen(req)
    imgdata = response.read()
    gobject.idle_add(self.setIcon, iter, imgdata)

在调试我的代码时,我发现下载似乎在“response = urllib2.urlopen(req)”这一行卡住了。问题出在哪里?是因为线程模块还是urllib2?我该如何解决这个问题呢?

提前谢谢你!

2 个回答

0

根据我的经验,CPython的多线程性能似乎比单线程要好一些。这是因为CPython的线程是基于操作系统的内核线程来实现的。不过,差别并不大,因为有个叫做全局解释器锁(GIL)的东西在限制着它。你可以用多进程来代替多线程,这样做很简单,因为它们的接口很相似。

3

可以考虑使用 urllib3。这个工具支持连接池和通过进程(不是线程)同时发送多个请求。这样可以解决你遇到的问题。不过,如果你要联系很多不同的网站,要注意清理连接池,因为每个网站都会有自己的连接池。

撰写回答