He escrito una clase de python muy simple que espera conexiones en un socket. La intención es incluir esta clase en una aplicación existente y enviar datos de manera asincrónica a los clientes que se conectan.Python socket accept blocks - impide que la aplicación se cierre
El problema es que al esperar en un socket.accept(), no puedo finalizar mi aplicación presionando ctrl-c. Tampoco puedo detectar cuando mi clase está fuera del alcance y notificar que termine.
Lo ideal es que la siguiente aplicación se cierre después de que caduque el time.sleep (4). Como puede ver a continuación, traté de usar seleccionar, pero esto también impide que la aplicación responda a ctrl-c. Si pudiera detectar que la variable 'a' ha salido del alcance en el método principal, podría establecer el indicador de abandono (y reducir el tiempo de espera en select para que responda).
¿Alguna idea?
gracias
import sys
import socket
import threading
import time
import select
class Server(threading.Thread):
def __init__(self, i_port):
threading.Thread.__init__(self)
self.quitting = False
self.serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.serversocket.bind((socket.gethostname(), i_port))
self.serversocket.listen(5)
self.start()
def run(self):
# Wait for connection
while not self.quitting:
rr,rw,err = select.select([self.serversocket],[],[], 20)
if rr:
(clientsocket, address) = self.serversocket.accept()
clientsocket.close()
def main():
a = Server(6543)
time.sleep(4)
if __name__=='__main__':
main()
Gracias por eso, funcionó. Intenté self.daemon = True pero eso no hizo nada (estoy ejecutando python 2.5 en Win32). Sin embargo, cambiarlo a self.setDaemon (True) hizo el truco. gracias! –