2015-10-04 1 views
1
import gevent 
from gevent.event import AsyncResult 
import time 

class Job(object): 
    def __init__(self, name): 
     self.name = name 

def setter(job): 
    print 'starting' 
    gevent.sleep(3) 
    job.result.set('%s done' % job.name) 

def waiter(job): 
    print job.result.get() 


# event loop 
running = [] 
for i in range(5): 
    print 'creating' 
    j = Job(i) 
    j.result = AsyncResult() 
    running.append(gevent.spawn(setter, j)) 
    running.append(gevent.spawn(waiter, j)) 

print 'started greenlets, event loop go do something else' 
time.sleep(5) 
gevent.joinall(running) 

gevent ne marche pas réellement commencer jusqu'à ce que joinall est appeléPython boucle événement w/gevent

  • Y at-il quelque chose qui commencerait/spawn gevent de manière asynchrone (pourquoi il ne démarre pas tout de suite, dès que Spawn est appelé)?
  • Existe-t-il un select/epoll sur les greenlets en cours d'exécution pour voir lequel doit être joint au lieu de joinall()?

Répondre

1

Non, cela ne démarre pas tout de suite. Il commencera dès que votre greenlet principal cédera au hub (relâche le contrôle en appelant sleep ou join par exemple)

Votre intention est clairement que cela commence quand vous appelez time. Ce n'est pas le cas, car vous ne l'avez pas corrigé.

Ajouter ces lignes au sommet de votre fichier:

from gevent import monkey 
monkey.patch_all() 

Cela aura alors le comportement que vous voulez (parce que sous le capot, time sera modifié pour céder au centre). Vous pouvez également appeler le gevent.sleep.

0

Étant donné que vous n'avez pas corrigé le singe, time.sleep() provoque une pause de votre application. Utilisez gevent.sleep (5) à la place.