python + threads

a ver si hay alguien q me pueda ayudar, estoy haciendo este programilla donde necesito 'escuchar' TCP y de vez en cuando ir viendo si ha llegado info (en este caso eventos). Bueno, el programa funciona guay lo que pasa es que hay aveces q el programa principal (el que lanza el hilo) peta , la cosa es que al petar el hilo se queda ejecutándose y se me pierde por el sistema XD . Me gustaría alguna manera de hacer que si el programa principal se cuelga también pare el programa que corre en otro hilo.

muchas gracias!
class StreamHandler ( Thread ):
   
    def __init__( self,verbose=False ):
        self.verbose=verbose
        #parece que no hace falta lock si confiamos en http://effbot.org/zone/thread-synchronization.htm
        self.event=dict()
        Thread.__init__( self )
   
    def isWaiting(self):
        """hay algun evento esperando"""
        return self.event!=dict()
   
    def getEvent(self):
        """coge el evento"""
        evento=self.event
        self.event=dict()
        return evento
   
    def run(self):
 
        self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
   
        self.server_socket.bind(('', PORT))
        self.server_socket.listen(10)
       
        # Add server socket to the list of readable connections
        CONNECTION_LIST.append(self.server_socket)
       
        print "TCP/IP server started."
       
        while 1:
            # Get the list sockets which are ready to be read through select
            read_sockets,write_sockets,error_sockets = select.select(CONNECTION_LIST,[],[])
           
            for sock in read_sockets:
                if sock == self.server_socket:
                    sockfd, addr = self.server_socket.accept()
                    CONNECTION_LIST.append(sockfd)
                    print "Client (%s, %s) connected" % addr
                   
                else:
                    # Data recieved from client, process it
                    try:
                        #In Windows, sometimes when a TCP program closes abruptly,
                        # a "Connection reset by peer" exception will be thrown
                        #while 1:
                        self.event = encoder.loads(sock.recv(RECV_BUFFER))                               
                    except:
                       print "Client (%s, %s) is offline" % addr
                       sock.close()
                       CONNECTION_LIST.remove(sock)
                       continue         
       
        server_socket.close()

## --------------------- INICIAMOS HILO SERVIDOR RED

recibir_eventos = StreamHandler()
recibir_eventos.start()
Es triste que cosas que parecen no se contesten y los post estupidos y repetidos se llenen de respuestas.

No puedo ayudarte, lo siento :P pero te subo el hilo a ver si otro te puede ayudar...

¡¡suerte!!
A ver: Los hilos no se 'pierden por el sistema'. El diagnóstico es un poco malo, mira a ver si puedes dar alguna información más. Por otro lado, el hilo maestro no debería 'colgarse' nunca, lo que tienes que hacer es detectar esa situación, controlarla y cargarte todos los hilos que tengas funcionando antes de 'morir'.

Es triste que cosas que parecen no se contesten y los post estupidos y repetidos se llenen de respuestas.

No puedo ayudarte, lo siento pero te subo el hilo a ver si otro te puede ayudar...


Hombre... lo triste es escribir por escribir.... ¿no te parece?

- ferdy
Supongo que no me expresado muy bien. Lo que estoy intentando conseguir es que cuando se produzca una un handled exception que pete el programa principal que me de tiempo a cargarme el hilo que está a la escucha. Supongo (ya te digo q supongo) que si meto parte del programa principal en un bloque try, catch lo conseguiría paro me molaría algo menos chapucerillo o saber si hay una solución mas elegante.

Nos vemos!
Yo creo que la solución elegante es usando el try catch en tu caso, además de la mas sencilla. Otras soluciones muy muy muy pero que muy sucias, seria con el hilo no principal mirar si el hilo principal esta muerto xD, pero eso si es feo, creo yo vaya XD

Miento, la solución elegante es, si he entendido bien, encontrar el problema del porque peta tu programa xD. Pero si no lo encuentras, usa un try&catch y solucionado para matar los otros hilos
Al final me decanto por la solución del bloque try.. catch, la verdad es que no queda mal, detecta justo lo que quería, pero ahora (empanao de mi) no sé como eliminar "a la fuerza" el hilo. También me serviría un operación de "¡matar todos los hilos que quiero salir!"

Ah, una cosa está clara lo lógico es que no pete, pero ahora estoy añadiendo cosas y es bastante común que peten partes y es un rollo tener los hilos ocupando puertos...., pero prometo que con el tiempo lo iré arreglando

Saludotes y muchas gracias por ayudarme
Ferdy escribió:Hombre... lo triste es escribir por escribir.... ¿no te parece?- ferdy

Vaya, pues me apunto a la moda de capitanquartz de la escritura insustancial...¿o no?. Si el compañero no upea el post, tu no lo ves, y gimbo se queda con un post perdido y sin tu ayuda...¿no te parece?
Vaya, pues me apunto a la moda de capitanquartz de la escritura insustancial...¿o no?. Si el compañero no upea el post, tu no lo ves, y gimbo se queda con un post perdido y sin tu ayuda...¿no te parece?


Incorrecto. El post ya estaba en la lista de 'dar una respuesta decente', el compañero solo ha conseguido pasarlo a la lista de 'dar una respuesta'. Lo que pasa es que las respuestas decentes llevan algo más de tiempo para articular que un simple "no se de qué hablas, pero voy a dar por saco a ver si otro sabe".

Así que no, no le ha ayudado, ha ido en su contra :/

- ferdy
Ferdy escribió:
Vaya, pues me apunto a la moda de capitanquartz de la escritura insustancial...¿o no?. Si el compañero no upea el post, tu no lo ves, y gimbo se queda con un post perdido y sin tu ayuda...¿no te parece?


Incorrecto. El post ya estaba en la lista de 'dar una respuesta decente', el compañero solo ha conseguido pasarlo a la lista de 'dar una respuesta'. Lo que pasa es que las respuestas decentes llevan algo más de tiempo para articular que un simple "no se de qué hablas, pero voy a dar por saco a ver si otro sabe".

Así que no, no le ha ayudado, ha ido en su contra :/

- ferdy

Es tu opinión (no la verdad), y no la comparto. Los motivos por los que piensas que rescatar un post con el objetivo de que alguien no se quede sin ayuda, es evidente que los dezconozco. Que tú tienes una lista de post relevantes a los que un futuro darás cobertura, es algo que creo que el resto de foreros no hace, con lo cual, la acción de capitanquartz estadísticamente es más útil que porculera.
gimbo escribió:Al final me decanto por la solución del bloque try.. catch, la verdad es que no queda mal, detecta justo lo que quería, pero ahora (empanao de mi) no sé como eliminar "a la fuerza" el hilo. También me serviría un operación de "¡matar todos los hilos que quiero salir!"

Ah, una cosa está clara lo lógico es que no pete, pero ahora estoy añadiendo cosas y es bastante común que peten partes y es un rollo tener los hilos ocupando puertos...., pero prometo que con el tiempo lo iré arreglando

Saludotes y muchas gracias por ayudarme


¿no te vale thread.exit() ?
¿no te vale thread.exit() ?


Esa es la idea, una vez consiga sincronizarlos para que ejecuten exit cuando el proceso maestro detecte una situación 'que no sabe manejar'.

Es tu opinión (no la verdad), y no la comparto. Los motivos por los que piensas que rescatar un post con el objetivo de que alguien no se quede sin ayuda, es evidente que los dezconozco. Que tú tienes una lista de post relevantes a los que un futuro darás cobertura, es algo que creo que el resto de foreros no hace, con lo cual, la acción de capitanquartz estadísticamente es más útil que porculera.


Yo creo que lo que consigues es cansar al personal...

- ferdy
Ferdy escribió:
¿no te vale thread.exit() ?


Esa es la idea, una vez consiga sincronizarlos para que ejecuten exit cuando el proceso maestro detecte una situación 'que no sabe manejar'.

Es tu opinión (no la verdad), y no la comparto. Los motivos por los que piensas que rescatar un post con el objetivo de que alguien no se quede sin ayuda, es evidente que los dezconozco. Que tú tienes una lista de post relevantes a los que un futuro darás cobertura, es algo que creo que el resto de foreros no hace, con lo cual, la acción de capitanquartz estadísticamente es más útil que porculera.


Yo creo que lo que consigues es cansar al personal...

- ferdy

Eres el primero que se queja de esto. ¿El personal eres tú?
Has escrito 2 paridas seguidas en un mismo post convencido de que son verdades universales, y encima con malas formas. Si pretendes que no te conteste, no las digas, y si decides decirlas y quieres que no te canse replicándote, pues cuenta hasta diez, respira y depura el "acabado" de lo que escribes.

Saludos y fin por mi parte.
Has escrito 2 paridas seguidas en un mismo post


Tus contribuciones a este, y otros hilos, si que son buenas. jaja
entonces al final ¿quien la tiene mas gorda? que no me ha quedado claro... ¿ferdy o atlante?
¿La cabeza? Este que suscribe.
Ferdy escribió:
Has escrito 2 paridas seguidas en un mismo post


Tus contribuciones a este, y otros hilos, si que son buenas. jaja

Veo que me sigues... [ayay]
f5inet escribió:entonces al final ¿quien la tiene mas gorda? que no me ha quedado claro... ¿ferdy o atlante?
Ferdy escribió:¿La cabeza? Este que suscribe.

No lo dudo ni un instánte, y mira que en mi familia calzamos buen sombrero...pero lo tuyo es espectacular macho.
Atlante escribió:Saludos y fin por mi parte

El hombre siempre miente...pero casi siempre por culpa de otro.
Juro solemnemente no seguir llenando de mierda este hilo, sea lo que sea lo que escriba aquí el compañero simpático de Eol.
15 respuestas