Python: Getting value from Gevent Greenlet

10,834

According to http://www.gevent.org/intro.html you want

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

tldr

Updated on June 24, 2022

Comments

  • tldr
    tldr about 2 years

    I'm learning Gevent, but can't get the value returned by the function called in a greenlet. The following code:

    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()
    

    gives me the error:

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

    What am I doing wrong, and how do I get the value from each greenlet?

  • tldr
    tldr over 10 years
    thanks Peter! Could you help me with my other Gevent question: stackoverflow.com/questions/20580252/…
  • Babu
    Babu over 8 years
    result = gevent.joinall(threads) assigning to a name is not necessary though.
  • Peter Gibson
    Peter Gibson over 8 years
    @Babu, yes looks like if you're not using the timeout keyword argument to joinall then you can ignore the result.