2012-05-07 15 views

Respuesta

7

Eso fue rápido de resolver después de ver el código fuente. ¡Gracias a los documentos por vincular directamente a la fuente!

Existe una excepción ExitNow que simplemente puede generar desde la aplicación, que sale del bucle.

Usando el ejemplo EchoHandler de los documentos, lo he modificado para salir inmediatamente al recibir datos.

class EchoHandler(asyncore.dispatcher_with_send): 

    def handle_read(self): 
     data = self.recv(8192) 
     if data: 
      raise asyncore.ExitNow('Server is quitting!') 

Además, tenga en cuenta que se puede coger ExitNow por lo que su aplicación no plantea si está utilizando internamente. Esta es parte de mi fuente:

def run(config): 
    instance = LockServer(config) 
    try: 
     asyncore.loop() 
    except asyncore.ExitNow, e: 
     print e 
5

El asycore loop también se cierra cuando no quedan conexiones, por lo que puede cerrar la conexión. Si tiene varias conexiones activas, puede usar asyncore.close_all().

4

Otro enfoque es usar el parámetro count de la llamada asyncore.loop. A continuación, puede envolver asyncore.loop en otra lógica:

while(i_should_continue()): 
    asyncore.loop(count=1) 

Esto no se detendrá inmediatamente una conexión abierta, o antes de tiempo de espera. Pero esto es probablemente una buena cosa? Estoy usando esto cuando comienzo un servidor de escucha.

+1

Esta es probablemente la solución adecuada si se quiere detener el bucle de "fuera del bucle". Las otras soluciones anteriores son para detener el ciclo dentro del ciclo. –

5

Prueba esto:

Una clase para el servidor (se extiende asyncore.dispatcher):

class Server(asyncore.dispatcher): 

    def __init__(self, port): 
     asyncore.dispatcher.__init__(self) 

     self.host = socket.gethostname() 
     self.port = port 

     self.create_socket(socket.AF_INET, socket.SOCK_STREAM) 
     self.set_reuse_addr() 
     self.bind((self.host, self.port)) 
     self.listen(5) 
     print "[Server] Listening on {h}:{p}".format(h=self.host, p=self.port) 

    def handle_accept(self): 
     pair = self.accept() 
     if pair is not None: 
      sock, addr = pair 
      print "[ServerSocket] We got a connection from {a}".format(a=addr) 
      SocketHandler(sock) 

Otra clase para el hilo que va a administrar el servidor (se extiende de rosca) ... cheque el método run(), donde hay que llamamos asyncore.loop():

class ServerThread(threading.Thread): 
    def __init__(self, port): 
     threading.Thread.__init__(self) 
     self.server = Server(port) 

    def run(self): 
     asyncore.loop() 

    def stop(self): 
     self.server.close() 
     self.join() 

ahora para realizar el servidor:

# This is the communication server, it is going to listen for incoming connections, it has its own thread: 
s = ServerThread(PORT) 
s.start()    # Here we start the thread for the server 
print "Server is ready..." 
print "Is ServerThread alive? {t}".format(t=str(s.is_alive())) 
raw_input("Press any key to stop de server now...") 
print "Trying to stop ServerThread..." 
s.stop() 
print "The server will die in 30 seconds..." 

Usted notará que el servidor no muere inmediatamente ... pero muere con gracia

Cuestiones relacionadas