2012-02-05 102 views
4

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

www.microsoft.com有一些東西,我的代碼結果不一致。有時'gevent'更快,有時候'urllib'。大部分時間都是通過下載microsoft.com頁面消耗的。嘗試與其他網址列表。 – reclosedev 2012-02-05 12:56:11

+0

我在microsoft.com和nytimes.com上得到了隨機超時...但只有gevent版本...奇怪... – Carpetsmoker 2012-02-05 12:57:42

+0

禁用修補程序「解決」了問題,如果我使用patch_socket() '',''patch_dns()''或者''patch_httplib()''這是不可靠和緩慢的。如果我禁用所有的猴子補丁,它的速度是其兩倍(〜1.5s vs 3s,順序腳本需要)......不要問我一個解釋: -/ – Carpetsmoker 2012-02-05 13:06:39

回答

1

OK
問題是一個老GEVENT包。
我剛剛卸載舊的,並從here安裝新的@reclosedev指出。
它現在工作正常。

+0

我在FreeBSD上運行並遇到同樣的問題。 gevent 0.13.6 with Python 2.7.2 – Carpetsmoker 2012-02-05 13:39:56

+2

嘗試從官方網站http://code.google.com/p/gevent/downloads/list更新軟件包 – reclosedev 2012-02-05 13:40:57

+0

@reclosedev 0.13.6是* latest * stable版本,所以沒有什麼更新。 1.0是在早期測試版,我希望你沒有建議使用beta ... – 2012-02-05 22:14:03