[Python] Problèmes avec les thread

darkneurone Messages postés 39 Date d'inscription   Statut Membre Dernière intervention   -  
kilian Messages postés 8732 Date d'inscription   Statut Modérateur Dernière intervention   -
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   Statut Modérateur Dernière intervention   15 662
 
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
FabM
 
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
FabM
 
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   Statut Modérateur Dernière intervention   15 662
 
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 8732 Date d'inscription   Statut Modérateur Dernière intervention   1 526
 
Et puis on se rend vite compte que c'est plus pratique.
1