Forum Programmation.python Detecter la fin d'un Thread

Posté par  .
Étiquettes : aucune
0
1
fév.
2008
Bonjour,

Je ne vois pas de méthode "propre" pour détecter la fin d'un Thread. Voici mon problème :
Soit une classe Server qui contient un tableau d'objet client, chacun de ces clients étant un thread. J'ai donc un truc de ce genre la :


class Server:
....def test:
........while True:
............while len(self.aClients) < 10:
................cl = Client()
................self.aClients.append(cl)
................cl.start()


Maintenant, mon objet Client se termine quand il a fini. Comment faire pour qu'il s'enleve du tableau aClients ?
Je pense à plusieurs solutions, mais je sais pas trop si elles sont dans l'esprit du Python, ou s'il y a plus propre :

- passer le tableau a mon Client pour qu'il s'y enleve tout seul (vive les mutex ;))
- faire une fonction dans un thread à part qui vérifie l'état des thread et s'endort pour une durée indéterminé (mon but étant plus le garbage collecting)


Avez vous d'autres idées / conseils ?

Merci
  • # RE: Detecter la fin d'un Thread

    Posté par  (site web personnel) . Évalué à 2.

    http://docs.python.org/lib/event-objects.html

    un exemple de code ça parle plus :-)



    import threading
    import time

    class Client(threading.Thread):
    ....def __init__(self, event):
    ........threading.Thread.__init__(self)
    ........self.event = event

    ....def run(self):
    ........print "test"
    ........time.sleep(1)
    ........print "finished"
    ........self.event.set()

    class Server(threading.Thread):

    ....def __init__(self):
    ........threading.Thread.__init__(self)
    ........self.clients = []

    ....def run(self):
    ........print "server started"

    ........for i in range(0,10):
    ............e = threading.Event()
    ............c = Client(e)
    ............self.clients.append(c)
    ............c.start()

    ........while 1:
    ............terminatedClient = []

    ............if len(self.clients) == 0:
    ................return

    ............for x in self.clients:
    ................if x.event.isSet():
    ....................terminatedClient.append(x)

    ............for x in terminatedClient:
    ................self.clients.remove(x)


    if __name__ == "__main__":
    ....server = Server()
    ....server.start()
    • [^] # Re: RE: Detecter la fin d'un Thread

      Posté par  . Évalué à 1.

      Merci bien je ne voyais pas trop comment utiliser cet objet Event.
      Dommage par contre qu'on ne puisse pas faire de wait() sur un tableau d'event pour eviter d'avoir à utiliser un time.sleep() lors du parcours de nos events..

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.