[Python] Problèmes avec les thread

Fermé
darkneurone Messages postés 39 Date d'inscription dimanche 11 mars 2007 Statut Membre Dernière intervention 12 juin 2008 - 12 juin 2008 à 12:45
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 - 9 déc. 2008 à 16:36
Bonjour à tous !

Bon voilà mon petit problème. Je fais un programme qui nécessite une quantité important de Thread... J'ai d'abord été confronté au problème de la limite à 1000 (et des poussières) threads. Pour le résoudre, j'ai 2 programmes :

- Program.py : Le premier qui a pour rôle d'effectuer des tâches en lançant 500 threads. (les tâches effectuées diffèrent en fonction des arguments reçu par le fichier (argv)).
- Launcher.py : Le deuxième n'est qu'un "lanceur de programme", qui aura pour but de lancer X*program.py... à l'aide d'une boucle et de passer des paramètres différents à celui-ci...

Maintenant je n'ai plus le problème de la limite des threads par programme... mais j'ai cette erreur à la place :

""""""""""""""""""""""""""""""""""""""""""
Unhandled exception in thread started by
Error in ss.excepthook:

Original exception was:
""""""""""""""""""""""""""""""""""""""""""

Voilà un exemple pour montrer comment je lance mes threads :

Launcher.py
def handler(i,rien):
    os.system('Program.py '+str(i))

while i<50:
    thread.start_new_thread(handler,(i,None))
    i = i + 1


Program.py
def handler(a, b):
    #Plusieurs actions utilisant les Sockets

for i in range(sys.argv[1],sys.argv[1]+250):
        a = i*2
        thread.start_new_thread(handler,(a, i))



Bon cherchez pas trop à savoir ce que fais ce programme ! Pour simplifier l'exemple, j'ai mis n'importe quel calcul et des arguments bidons aux fonctions... Mais le principe reste le même.

J'ai effectué pas mal de recherche sur le net sur cette erreur... et personne n'a eu de répondre pour résoudre ce problème. C'est pourquoi je me tourne vers vous en espérant que vous ayez des idées pour m'aider !

---------------------------------------
PS : j'ai essayer d'utiliser les Lock()... mais je pense que je n'ai pas très bien compris le fonctionnement...

Voici ce que j'avais mis :
def handler(i,rien):
    os.system('Program.py '+str(i))

while i<65535:
    thread.start_new_thread(handler,(i,None))
    lock = threading.Thread(target=handler,args=(i,None))
    lock.start()
    lock = threading.Lock()
    try :
        lock.acquire()
    finally :
        lock.release()
    i = i + 255


J'ai essayé de me basé sur l'exemple du wikiflibuste( http://wikipython.flibuste.net/moin.py/QuestionsGenerales?action=highlight&value=multithreading ).
mais je n'ai pas bien saisis apparemment !


Merci pour votre aide et pour m'avoir au moins lu !
Bonne journée à tous.

5 réponses

sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 659
8 déc. 2008 à 13:43
Ton programme ne vérifie pas que les threads sont morts avant de quitter ( avec join() ).

Résultat: Une fois le thread principal terminé, le garbage collector commencer à nettoyer les objets alors qu'il y a encore des threads vivants, d'où les exceptions.
2
Bonjour,

J'ai exactement le même problème, mais avec un système embarqué.

Le programme suivant :

import thread

def plop(pid):
print str(pid)

for i in range(6):
thread.start_new(plop,(i,))

Me donne :

[root@armadeus test_soft]# python test.py
0
1
Unhandled exception in thread started by
Error in sys.excepthook:

Original exception was:
Unhandled exception in thread started by
Error in sys.excepthook:

Original exception was:
Unhandled exception in thread started by
Error in sys.excepthook:

Original exception was:
Unhandled exception in thread started by
Error in sys.excepthook:

Original exception was:


Si quelqu'un à une idée ?
1
Merci,

Maintenant ça fonctionne.
Du coup je suis obligé d'utiliser le module threading et de faire une classe qui en hérite :

import threading

class MyThread(threading.Thread):
    def __init__(self,myId):
        self.myId = myId
        threading.Thread.__init__(self)

    def run(self):
        print str(self.myId)

threads = []
for i in range(6):
    thread = MyThread(i)
    thread.start()
    threads.append(thread)

for thread in threads:
    thread.join()
print "end"
1
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 659
9 déc. 2008 à 16:32
De rien. Content que ça fonctionne.

L'utilisation de la classe threading est une bonne chose.
1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
9 déc. 2008 à 16:36
Et puis on se rend vite compte que c'est plus pratique.
1