我正在使用gevent预执行并发下载。
基于this例子是这样的代码:为什么python gevent比串行更慢?
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页面消耗的。尝试与其他网址列表。 – reclosedev 2012-02-05 12:56:11
我在microsoft.com和nytimes.com上得到了随机超时...但只有gevent版本...奇怪... – Carpetsmoker 2012-02-05 12:57:42
禁用修补程序“解决”了问题,如果我使用patch_socket() '',''patch_dns()''或者''patch_httplib()''这是不可靠和缓慢的。如果我禁用所有的猴子补丁,它的速度是其两倍(〜1.5s vs 3s,顺序脚本需要)......不要问我一个解释: -/ – Carpetsmoker 2012-02-05 13:06:39