почему gevent 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

person yossi    schedule 05.02.2012    source источник
comment
Что-то с www.microsoft.com, мои результаты для вашего кода противоречивы. Иногда gevent быстрее, иногда urllib. И больше всего времени уходит на загрузку страницы microsoft.com. Попробуйте это со списком других URL-адресов.   -  person reclosedev    schedule 05.02.2012
comment
У меня случайные таймауты на microsoft.com и nytimes.com... но только с версией gevent... Странно...   -  person Martin Tournoij    schedule 05.02.2012
comment
Отключение исправления денег решило проблему. Если я использую patch_socket(), patch_dns() или patch_httplib(), это ненадежно и медленно. Если я отключу все исправления обезьяны, это будет в два раза быстрее (~ 1,5 с против ~ 3 с, которое занимает последовательный скрипт) ... Не спрашивайте у меня объяснений :-/   -  person Martin Tournoij    schedule 05.02.2012
comment
@Carpetsmoker, URL-адресов слишком мало. Время отклика сайтов зависит от многих факторов. Попробуйте этот список pastebin.com/3739te6J URL-адресов. И если вы запустите тесты OP несколько раз, вы увидите, что Microsoft будет получать тайм-ауты не только с gevent.   -  person reclosedev    schedule 05.02.2012
comment
используя список URL-адресов, предоставленный @reclosedev, я получаю «NotImplementedError: inet_ntop() недоступен на этой платформе»   -  person yossi    schedule 05.02.2012
comment
@yossi, я уже давно получил эту ошибку. Попробуйте удалить google.com, это связано с IPv6. Есть некоторое решение этой проблемы.   -  person reclosedev    schedule 05.02.2012


Ответы (1)


ok
проблема была в старом пакете gevent.
я просто удалил старый и установил новый из здесь, как указал @reclosedev.
и теперь все работает нормально.

person yossi    schedule 05.02.2012