为什么Python gevent比串行慢?

4 投票
1 回答
1877 浏览
提问于 2025-04-17 12:22

我正在使用 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

1 个回答

1

好的,
问题出在一个旧版的gevent包上。
我只是把旧的卸载掉,然后按照@reclosedev的建议,从这里安装了新版。
现在一切都正常了。

撰写回答