Creando un servidor multiproceso usando el framework SocketServer en python

Esta pregunta está resuelta. El código de trabajo se da a continuación en esta publicación también.

Problema : Actualmente me estoy familiarizando con la progtwigción de red con Python. Actualmente estoy trabajando con el framework SocketServer. Ahora mi pregunta es ¿cómo puedo crear un servidor multihebra que pueda aceptar más de un cliente utilizando el módulo SocketServer? Básicamente intenté usar este código

t = Thread(target=server.serve_forever()) t.start() 

Actualmente en mi progtwig el servidor solo acepta un cliente. Me conecto al servidor utilizando netcat. El primer cliente se conecta al servidor sin ningún problema. Si trato de conectarme al servidor desde el segundo cliente, el cliente sigue esperando para conectarse. Tan pronto como desconecto el primer cliente, el segundo cliente se conecta con el servidor automáticamente. Me parece que el multi-threading no está funcionando. No puedo averiguar dónde me estoy perdiendo algo. Cualquier sugerencia será agradecida. Mi código es el siguiente:

 #!/usr/bin/env python import SocketServer from threading import Thread class service(SocketServer.BaseRequestHandler): def handle(self): data = 'dummy' print "Client connected with ", self.client_address while len(data): data = self.request.recv(1024) self.request.send(data) print "Client exited" self.request.close() server = SocketServer.TCPServer(('',1520), service) t = Thread(target=server.serve_forever()) t.start() 

Gracias

Actualización: El siguiente código es la solución:

 #!/usr/bin/env python import SocketServer from threading import Thread class service(SocketServer.BaseRequestHandler): def handle(self): data = 'dummy' print "Client connected with ", self.client_address while len(data): data = self.request.recv(1024) self.request.send(data) print "Client exited" self.request.close() class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer): pass t = ThreadedTCPServer(('',1520), service) t.serve_forever() 

Es mucho más simple de lo que piensas:

 class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer): pass 

Entonces solo tiene que usar su nuevo ThreadedTCPServer lugar de TCPServer .

Para más información puedes leer algunos documentos .

Sin embargo en tu código cometiste algunos errores:

  1. El argumento de target debe ser un objeto callable no un objeto “ya llamado”.
  2. Para manejar muchas solicitudes necesitas construir un grupo de subprocesos. Si solo usas un hilo, no hace ninguna diferencia si es el hilo principal o un hilo “secundario”.

Bueno, gracias a @Faust por la sugerencia. El código que se da a continuación ahora funciona como estaba previsto.

 #!/usr/bin/env python import SocketServer from threading import Thread class service(SocketServer.BaseRequestHandler): def handle(self): data = 'dummy' print "Client connected with ", self.client_address while len(data): data = self.request.recv(1024) self.request.send(data) print "Client exited" self.request.close() class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer): pass server = ThreadedTCPServer(('',1520), service) server.serve_forever() 

¿No deberías bucear el

 server = SocketServer.TCPServer(('',1520), service) t = Thread(target=server.serve_forever()) t.start() 

Solo una suposición..