associação pythonbrasil[11] django zope/plone planet Início Logado como (Entrar)

ThreadingXmlrpc

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