Est-il possible d'utiliser les librairies standard de python xmlrpclib avec gevent? Actuellement, je suis tenté d'utiliser monkey.patch_all(), mais sans succès.Utiliser gevent avec python xmlrpclib
from gevent import monkey
monkey.patch_all()
import gevent
import time
import xmlrpclib
from SimpleXMLRPCServer import SimpleXMLRPCServer
import urllib2
def fetch(url):
g = gevent.spawn(urllib2.urlopen, url)
return g.get().read()
def is_even(n):
return n%2 == 0
def req(url):
return fetch(url)
server = SimpleXMLRPCServer(("localhost", 8000))
print "Listening on port 8000..."
server.register_function(is_even, "is_even")
server.register_function(req, "req")
server.serve_forever()
urllib2.urlopen bloque le serveur. Il me semble, que monkey.patch_all n'a pas patché le socket, c'est pourquoi il bloque.
Merci! La version filetée fonctionne comme prévu! Mais comment retourner le résultat asynchrone de urllib2.urlopen? – frx
Je ne suis pas sûr de comprendre ce que vous entendez par "renvoyer le résultat de manière asynchrone". Qu'essayez-vous d'accomplir? –
Corrigez-moi si je me trompe. Chaque nouvelle connexion est engendrée dans le nouveau greenlet, donc je n'ai pas besoin de lancer urlopen dans le nouveau greenlet. quand urlopen est appelé et s'il y a plus d'une connexion ou qu'un nouvel événement se produit, gevent passe à un autre coroutine, quand le contenu arrive sur le socket, il revient à urlopen coroutine et renvoie le résultat. – frx