为啥 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 比串行慢?的主要内容,如果未能解决你的问题,请参考以下文章

lambda 比 python 中的函数调用慢,为啥

为啥我的 Spark 运行速度比纯 Python 慢?性能比较

为啥python斐波那契序列循环比递归慢?

在 python 中,为啥从数组读取比从列表读取慢?

为啥我的基数排序 python 实现比快速排序慢?

为啥pypy3比python慢