Mit GEVENT mit Python xmlrpclib
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.
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.