2016-02-17 4 views
1

Je pose cette question après une journée complète de piratage et d'essayer de comprendre ce qui ne va pas ici.
Je veux envoyer une demande en utilisant le paquet requests, et le faire dans un mode non-bloquant.
Pour cela, j'utilise le bon paquet gevent avec ses capacités de correction de singe, que j'utilise depuis longtemps.gevent singe patch pauses gevent.sleep (0)?

J'ai une boucle principale qui reçoit un message et engendre un nouveau greenlet qui crée une demande POST pour chaque message. Suite à la commande spawn, la boucle principale fait un gevent.sleep(0) pour permettre aux greenlets de faire leur travail.

Le code ci-dessous est un exemple simplifié (sans la boucle principale):

from gevent import monkey; monkey.patch_all() 
import gevent # (version 1.0.2) 
import requests # version 2.7.0 

def f(): 
    requests.post('http://localhost:8888/', data='*' * 80) 

gevent.spawn(f) 
gevent.sleep(0) 

Si vous essayez d'exécuter si à partir de la ligne de commande (ou un fichier), la demande ne sera pas envoyé.
Après avoir joué, j'ai réussi à obtenir ce code pour envoyer la demande si je:

  1. Retirez la ligne de rapiéçage de singe (qui est pas bon car alors il bloque), ou
  2. changement la valeur du sleep à 0.1 (ce qui n'est pas bon parce que je ne veux vraiment pas que la boucle principale dorme).

Les deux options sont un grand NON pour moi.
Est-ce que quelqu'un sait pourquoi ce comportement étrange et comment le réparer?

Répondre

0

Alors, je pense que ce dont vous avez besoin est: gevent.joinall([g1, g2, ...]), mais pas gevent.sleep

+0

'joinall' fonctionne, mais mon cas d'utilisation est plus complexe que l'exemple J'ai posté ci-dessus, qui est un scénario simplifié de ma situation dans le monde réel. – user1102018