Pergunta

É possível usar o Libs XmlrpClib padrão do Python com o Gevent? Atualmente, tentei usar o Monkey.patch_all (), mas sem sucesso.

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 o servidor. Parece -me que o macaco.patch_all não corrigiu o soquete, é por isso que ele bloqueia.

Foi útil?

Solução

O soquete está remendado bem, mas há outros problemas com seu código.

Primeiro, isso

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

é o mesmo que

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

Você está gerando um novo Greenlet aqui, mas bloqueando o atual até que o novo termine. Isso não faz as coisas simultaneamente. É exatamente o mesmo que apenas executar o Urlopen e esperar que ele termine.

Segundo, a fim de aproveitar Gevent Haver mais de um fio leve (Greenlet) funcionando ao mesmo tempo.

SimpxmlrpcServer, no entanto, é definido como

class SimpleXMLRPCServer(SocketServer.TCPServer,
                         SimpleXMLRPCDispatcher):

O que significa que serve uma conexão de cada vez.

Se você fizer o seu próprio SimpleXMLRPCServer aula, mas use ThreadingTCPServer ao invés de TCPServer, você deve poder se beneficiar do uso do Gevent aqui.

monkey.patch_all() patches threading Para se tornar baseado em Greenlet, portanto, esse servidor gerará uma nova Greenlet para cada nova conexão.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top