Receita: ThreadingXMLRPCServer
Nesse cookbook, eu demonstro a implementação de multi-threading a classe SimpleXMLRPCServer.
Código
1 from SimpleXMLRPCServer import SimpleXMLRPCDispatcher,SimpleXMLRPCRequestHandler
2 import SocketServer
3
4 class ThreadingXMLRPCServer(SocketServer.ThreadingTCPServer,SimpleXMLRPCDispatcher):
5 """This class implements multi-threading to the SimpleXMLRPCServer class."""
6 def __init__(self, addr, logRequests=1):
7 """Basic initialization."""
8 self.logRequests = logRequests
9 SimpleXMLRPCDispatcher.__init__(self)
10 SocketServer.TCPServer.__init__(self, addr, SimpleXMLRPCRequestHandler)
Exemplo de uso
Server
1 from ThreadingXMLRPCServer import ThreadingXMLRPCServer
2 from time import sleep
3
4 def soma(a,b):
5 sleep(3)
6 return a+b
7
8 if __name__ == '__main__':
9 #Criando um servidor xmlrpc em localhost na porta 9980, para não conflitar com outros servidores.
10 txmlrpc_server = ThreadingXMLRPCServer( ('',9980) )
11 txmlrpc_server.register_function(soma)
12 txmlrpc_server.serve_forever()
Client
1 from thread import start_new_thread
2 from time import sleep
3 from xmlrpclib import ServerProxy
4
5 if __name__ == '__main__':
6 def request(s,x,y):
7 print 'Request de %s+%s=%s' % (x,y,s.soma(x,y))
8
9 sp = ServerProxy('http://localhost:9980/')
10 for i in xrange(3):
11 print 'Disparando request %s' % i
12 start_new_thread(request,(sp,i,i*2) )
13 print 'Aguardando 10 segundos pelas respostas.'
14 sleep(10)
- Veja que no server, eu forcei um delay de 3 segundos para processar o request, isto simula um processo demorado, no cliente, eu criei 3 threads que fazem request ao server e espero 10 segundos pelas respostas. Como teste, você pode substituir o ThreadingXMLRPCServer pelo SimpleXMLRPCServer e observar como ele responde uma requisição atrás da outra.
Volta para CookBook
Mauricio Souza Lima