Pregunta

¿Es posible utilizar librerías estándar xmlrpclib de pitón con GEvent? Actualmente estoy tratado de utilizar monkey.patch_all (), pero sin éxito.

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 está bloqueando servidor. A mi me parece, que monkey.patch_all no parcheado zócalo, es por eso que los bloques.

¿Fue útil?

Solución

El conector está parcheado bien, pero hay otros problemas con su código.

En primer lugar, este

def fetch(url):
    g = gevent.spawn(urllib2.urlopen, url)
    return g.get().read()

es el mismo que

def fetch(url):
    return urllib2.urlopen(url).read()

Usted está generando un nuevo greenlet aquí, pero entonces el bloqueo de la actual, hasta que uno nuevo se hace. No tiene cosas concurrente. Es exactamente lo mismo que simplemente corriendo urlopen y esperar a que termine.

En segundo lugar, con el fin de tomar ventaja de GEvent no tiene que ser más de un hilo de peso ligero (greenlet) que se ejecutan al mismo tiempo.

SimpleXMLRPCServer, sin embargo, se define como

class SimpleXMLRPCServer(SocketServer.TCPServer,
                         SimpleXMLRPCDispatcher):

lo que significa que sirve una conexión a la vez.

Si usted hace su propia clase SimpleXMLRPCServer, pero el uso ThreadingTCPServer en lugar de TCPServer, usted debe poder beneficiarse del uso GEvent aquí.

monkey.patch_all() parches threading para convertirse basada en greenlet, por lo que dicho servidor generará un nuevo greenlet para cada nueva conexión.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top