No pude encontrar esto en el docs, pero ¿cómo voy a salir del asyncore.loop()
sin usar señales?¿Cómo cerrar un asignador asyncore desde un controlador?
Respuesta
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
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().
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.
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
- 1. Cerrar un formulario desde el controlador de carga
- 2. Cómo mostrar un DialogFragment desde un controlador
- 3. ¿Cómo cerrar un hilo desde dentro?
- 4. Leyendo un sitio web con asyncore
- 5. Cómo acceder a ApplicationContext desde un controlador
- 6. ¿Cómo obtener la respuesta de un controlador desde otro controlador?
- 7. ¿Cerrar un formulario desde otro formulario?
- 8. Cómo generar un hipervínculo desde un controlador en cakePHP
- 9. ¿Cómo cerrar un ExecutorService?
- 10. ¿Cómo puedo activar un diálogo de JQuery para cerrarlo desde un controlador de vista parcial MVC?
- 11. Python asyncore & dbus
- 12. cómo cerrar una ventana desde un proceso diferente
- 13. asyncore pitón cuelga
- 14. ¿Cómo usar UISearchDisplayController desde un controlador dentro de un controlador UITabBar?
- 15. ¿Extiende un controlador desde el controlador en otro módulo?
- 16. Use un asignador personalizado con boost :: bimap
- 17. Establecer un asignador personalizado para cadenas
- 18. ¿Cerrar un JFrame sin cerrar otro?
- 19. ¿Cómo accedo a la función Twig path() desde un controlador?
- 20. Cómo llamar a un método de controlador desde Javascript
- 21. Cómo utilizar un controlador JDBC desde una ubicación arbitraria
- 22. ¿Cómo devolver HTML directamente desde un controlador Rails?
- 23. ¿Cómo puedo declarar explícitamente una vista desde un controlador Rails?
- 24. ¿Cómo llamo a un método de controlador desde JQuery?
- 25. Cómo llamar a jQuery correctamente desde un controlador AngularJS
- 26. Actualización de la IU desde un servicio (¿con un controlador?)
- 27. Cómo cerrar un jframe sin cerrar el programa principal
- 28. ¿Cómo cancelar un formulario cerrar en Cerrar evento?
- 29. Cómo cerrar iframe desde dentro de iframe?
- 30. callbacks asyncore lanzando hilos ... ¿está bien?
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. –