/ / Pourquoi gevent.spawn n'exécute-t-il pas la fonction paramétrée avant un appel à Greenlet.join? - python, asynchrone, gevent

Pourquoi gevent.spawn n'exécute-t-il pas la fonction paramétrée avant un appel à Greenlet.join? - python, asynchrone, gevent

Je souhaite émettre une requête HTTP POST asynchrone en utilisant gevent - Je ne me soucie pas de la réponse, je veux simplement exécuter la requête le plus tôt possible. Cependant, chaque fois que j'essaie de le faire en utilisant gevent.spawn, la demande ne s'exécute jamais. Je le sais car appeler le .ready() ou .successful() méthodes sur le Greenlet qui est retourné de gevent.spawn revient toujours False.

Cependant, le greenlet a commencé, parce que si j'appelle glet = gevent.spawn(...), puis glet.start(), Je reçois une erreur en disant AssertionError: Greenlet already started.

La seule fois où je reçois un glet.ready() == True est quand j'appelle glet.join(), mais c’est une opération bloquante. Comment puis-je faire exécuter le Greenlet sans attendre qu'il soit terminé?

Réponses:

7 pour la réponse № 1

Comme les greenlets sont coopératifs, votre nouveau greenlet ne fonctionnera pas tant que vous n’y aurez pas cédé. Après avoir appelé spawn, appelez gevent.sleep(0) pour céder et votre greenet devrait fonctionner.

Il continuera à fonctionner jusqu'à ce qu'il fasse quelque chose qui le cause (comme le démarrage de cette requête HTTP). Ensuite, votre autre code peut reprendre à nouveau.

MODIFIER:

Pour répondre à votre question sur grequests, la grequests.send() doc dit:

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

Puisque vous n’avez pas spécifié de pool, la demande s’arrête pour que votre greenlet se termine. En d’autres termes, une fois renvoyée, la greenlet est déjà terminée. Pour obtenir la réponse, voir glt.get() de la greenlet retournée.