为啥 python gevent 比串行慢?
Posted
技术标签:
【中文标题】为啥 python gevent 比串行慢?【英文标题】:why python gevent is slower than serial ?为什么 python gevent 比串行慢? 【发布时间】: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'
【参考方案1】:
好的 问题是一个旧的 gevent 包。 正如@reclosedev 指出的那样,我刚刚卸载了旧的并从here 安装了新的。 现在工作正常。
【讨论】:
我在 FreeBSD 上运行并且遇到了同样的问题。 gevent 0.13.6 与 Python 2.7.2 尝试从官方网站更新包code.google.com/p/gevent/downloads/list @reclosedev 0.13.6 是 最新 稳定版本,因此无需更新。 1.0 处于早期测试阶段,我希望您不建议使用测试版... @PiotrDobrogost,Win32 上的 0.13.6 存在一些问题(例如 IPv6 支持),1.0b1 解决了这些问题。使用什么取决于其他人。 我在 Ubuntu 12.04 和 Gevent 0.13.8 上遇到了同样的问题。升级到 Gevent 1.0rc2 修复了它。以上是关于为啥 python gevent 比串行慢?的主要内容,如果未能解决你的问题,请参考以下文章