Frage

Ist es möglich, Python Standard Libs xmlrpclib mit GEVENT zu benutzen? Derzeit ich bin versucht, Gebrauch monkey.patch_all (), aber ohne Erfolg.

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 blockiert Server. Es scheint mir, dass monkey.patch_all nicht Buchse geflickt, deshalb blockiert es.

War es hilfreich?

Lösung

Die Buchse ist in Ordnung geflickt, aber es gibt auch andere Probleme mit Ihrem Code.

Zuerst diese

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

ist die gleiche wie

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

Sie sind Laichen einen neuen greenlet hier aber dann die aktuelle Blockierung, bis das neue fertig ist. Es macht die Sache nicht gleichzeitig. Es ist genau das gleiche wie gerade läuft urlopen und es bis zum Ende zu warten.

Zweitens, um die Vorteile von GEVENT dort bekam mehr als ein leichtes Thread zu sein (greenlet) zur gleichen Zeit ausgeführt werden.

SimpleXMLRPCServer jedoch ist definiert als

class SimpleXMLRPCServer(SocketServer.TCPServer,
                         SimpleXMLRPCDispatcher):

Das bedeutet, es eine Verbindung zu einer Zeit dient.

Wenn Sie eine eigene SimpleXMLRPCServer Klasse machen, aber die Verwendung ThreadingTCPServer statt TCPServer, sollten Sie verwenden GEVENT hier profitieren können.

monkey.patch_all() Patches threading greenlet Basis werden, so wie zum Server wird eine neue greenlet für jede neue Verbindung laichen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top