2013-12-14 2 views
3

Я изучаю Gevent, но не могу получить значение, возвращаемое функцией, вызванной в greenlet. Следующий код:Python: Получение значения от Gevent Greenlet

import gevent.monkey 
gevent.monkey.patch_socket() 

import gevent 
from gevent import Greenlet 

import urllib2 
import simplejson as json 

def fetch(pid): 
    response = urllib2.urlopen('http://time.jsontest.com') 
    result = response.read() 
    json_result = json.loads(result) 
    datetime = json_result['time'] 

    print('Process %s: %s' % (pid, datetime)) 
    return json_result['time'] 

def synchronous(): 
    for i in range(1,10): 
     fetch(i) 

def asynchronous(): 
    threads = [Greenlet.spawn(fetch, i) for i in range(10)] 
    result = gevent.joinall(threads) 
    print [Greenlet.value(thread) for thread in threads] 

print('Synchronous:') 
synchronous() 

print('Asynchronous:') 
asynchronous() 

дает мне ошибку:

print [Greenlet.value(thread) for thread in threads] 
AttributeError: type object 'Greenlet' has no attribute 'value' 

Что я делаю не так, и как я могу получить значение из каждого greenlet?

ответ

7

По http://www.gevent.org/intro.html вы хотите

def asynchronous(): 
    threads = [Greenlet.spawn(fetch, i) for i in range(10)] 
    result = gevent.joinall(threads) 
    print [thread.value for thread in threads] 
+0

спасибо Питер! Не могли бы вы помочь мне с моим другим вопросом Gevent: http://stackoverflow.com/questions/20580252/python-requests-module-throws-exception-with-gevent – tldr

+0

'result = gevent.joinall (threads)' присвоение имени не обязательно. – Babu

+0

@Babu, похоже, если вы не используете аргумент ключевого слова 'timeout' для' joinall', тогда вы можете проигнорировать результат. –