Python:从Gevent Greenlet获取值

6

我正在学习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的值?
1个回答

16
根据 http://www.gevent.org/intro.html 的说法,你想要
def asynchronous():
    threads = [Greenlet.spawn(fetch, i) for i in range(10)]
    gevent.joinall(threads)
    print([thread.value for thread in threads])

1
谢谢Peter!你能帮我解决另一个关于Gevent的问题吗:https://dev59.com/MHrZa4cB1Zd3GeqP0D9c - tldr
result = gevent.joinall(threads) 分配一个名称并不是必要的。 - Babu
@ Babu,是的,看起来如果您没有使用 timeout 关键字参数来 joinall,那么可以忽略结果。 - Peter Gibson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,