【发布时间】:2012-02-27 06:48:27
【问题描述】:
我正在使用gevent 执行并发下载。
基于this 示例,代码如下:
import gevent
from gevent import monkey
urls = ['https://www.djangoproject.com/','http://www.nytimes.com/','http://www.microsoft.com']
monkey.patch_all()
import urllib2
from datetime import datetime
def print_head(url):
print ('Starting %s' % url)
data = urllib2.urlopen(url).read()
print ('%s: %s bytes: %r' % (url, len(data), data[:50]))
startTime = datetime.now()
jobs = [gevent.spawn(print_head, url) for url in urls]
gevent.joinall(jobs)
totalTime = datetime.now() - startTime
print "Total time: %s" % totalTime
我的问题是上面的代码比串行版本花费的时间要长得多,并且在大多数情况下它会超时。这是更快的串行版本:
import urllib2
from datetime import datetime
urls = ['https://www.djangoproject.com/','http://www.nytimes.com/','http://www.microsoft.com']
def print_head(url):
print ('Starting %s' % url)
data = urllib2.urlopen(url).read()
print ('%s: %s bytes: %r' % (url, len(data), data[:50]))
startTime = datetime.now()
for url in urls:
try:
print_head(url)
except:
print 'ops EXCEPTION :('
totalTime = datetime.now() - startTime
print "Total time: %s" % totalTime
【问题讨论】:
-
www.microsoft.com 有问题,我的代码结果不一致。有时
gevent更快,有时urllib。而且大部分时间都花在了下载 microsoft.com 页面上。尝试使用其他网址列表。 -
我在 microsoft.com 和 nytimes.com 上遇到随机超时......但仅限 gevent 版本......奇怪......
-
禁用资金修补“解决了”问题,如果我使用
patch_socket()、patch_dns()或patch_httplib(),它是不可靠且缓慢的。如果我禁用所有猴子补丁,它的速度是两倍(〜1.5s vs〜3s顺序脚本需要)......不要问我解释:-/ -
@Carpetsmoker,网址太少。站点的响应时间取决于许多因素。试试这个列表pastebin.com/3739te6J 的网址。如果您多次运行 OP 的测试,您会发现 microsoft 不仅使用 gevent 会超时。
-
使用@reclosedev 提供的 url 列表我得到 'NotImplementedError: inet_ntop() is not available on this platform'