2013-04-03 3 views
9

Mi piacerebbe emettere una richiesta POST HTTP asincrona usando gevent - Non mi interessa la risposta, voglio semplicemente eseguire la richiesta il prima possibile. Tuttavia, ogni volta che cerco di farlo utilizzando gevent.spawn, la richiesta non viene mai eseguita. Lo so perché chiamare i metodi .ready() o .successful() su Greenlet restituito da gevent.spawn restituisce sempre False.Perché gevent.spawn non esegue la funzione parametrizzata fino alla chiamata a Greenlet.join?

Tuttavia, il Greenlet ha iniziato, perché se io chiamo glet = gevent.spawn(...), poi glet.start(), ottengo un errore che dice AssertionError: Greenlet already started.

L'unica volta che ottengo un glet.ready() == True è quando chiamo glet.join(), ma questa è un'operazione di blocco. Come posso eseguire Greenlet senza attendere che si completi?

risposta

7

Poiché i greenlet sono cooperativi, il tuo nuovo greenlet non funzionerà finché non ci arriverete. Dopo aver chiamato spawn, chiamare gevent.sleep(0) per produrre e il tuo greenlet dovrebbe essere eseguito.

Continuerà a funzionare fino a quando non fa qualcosa che lo fa arrendersi (come il kicking off http req). Quindi l'altro codice può riprendere di nuovo.

EDIT:

Per affrontare le tue domande su grequests, il doc grequests.send() dice:

send(r, pool=None, stream=False) 
    Sends the request object using the specified pool. If a pool isn't 
    specified this method blocks. Pools are useful because you can specify size 
    and can hence limit concurrency 

Dal momento che non è stata specificata una piscina, i blocchi di richiesta per il vostro greenlet per finire. In altre parole, una volta restituito il verdetto è già stato completato. Per ottenere la risposta, vedere glt.get() del verdetto restituito.

+0

Ah sembra funzionare! Tuttavia, quando sto usando la libreria grequests (https://github.com/kennethreitz/grequests), chiamando grequests.send (grequests.request ("POST", )) crea un Greenlet, ma questo Greenlet no eseguire anche dopo aver chiamato gevent.sleep(). Sai perché? – neptune

+1

@neptune: vedere l'aggiornamento – FatalError