Сокет исправлен, но с вашим кодом есть другие проблемы.
Во-первых, это
def fetch(url):
g = gevent.spawn(urllib2.urlopen, url)
return g.get().read()
совпадает с
def fetch(url):
return urllib2.urlopen(url).read()
Вы создаете новый гринлет здесь, но затем блокируете текущий, пока этот новый не будет сделан. Это не делает вещи параллельными. Это то же самое, что просто запустить urlopen и дождаться его завершения.
Во-вторых, чтобы воспользоваться gevent , должно быть запущено более одной легкой нити (гринлета) одновременно.
SimpleXMLRPCServer, однако, определяется как
class SimpleXMLRPCServer(SocketServer.TCPServer,
SimpleXMLRPCDispatcher):
, что означает, что он обслуживает одно соединение за раз.
Если вы создаете свой собственный SimpleXMLRPCServer
класс, но используете ThreadingTCPServer
вместо TCPServer
, вы сможете получить пользу от использования gevent здесь.
monkey.patch_all()
исправления threading
, чтобы стать на основе greenlet, поэтому такой сервер будет порождать новый greenlet для каждого нового соединения.