232 votes

Créer des threads en python

J'ai un script et je veux qu'une fonction soit exécutée en même temps que l'autre.

Exemple de code que j'ai consulté:

 import threading


def MyThread ( threading.thread ):

  doing something........

def MyThread2 ( threading.thread ):

  doing something........

MyThread().start()
MyThread2().start()
 

J'ai de la difficulté à faire en sorte que cela fonctionne. Je préférerais que cela fonctionne en utilisant une fonction threadée plutôt qu'une classe.

Merci pour toute aide.

Ceci est le script de travail, Merci pour toute l'aide.

 class myClass():

    def help(self):

        os.system('./ssh.py')

    def nope(self):
        a = [1,2,3,4,5,6,67,78]
        for i in a:
            print i
            sleep(1)


if __name__ == "__main__":
    Yep = myClass()
    thread = Thread(target = Yep.help)
    thread2 = Thread(target = Yep.nope)
    thread.start()
    thread2.start()
    thread.join()
    print 'Finished'
 

390voto

jkp Points 20410

Vous n'avez pas besoin d'utiliser une sous-classe de Thread pour que cela fonctionne. Jetez un coup d'œil à l'exemple simple que je présente ci-dessous pour voir comment:

 from threading import Thread
from time import sleep

def threaded_function(arg):
    for i in range(arg):
        print "running"
        sleep(1)


if __name__ == "__main__":
    thread = Thread(target = threaded_function, args = (10, ))
    thread.start()
    thread.join()
    print "thread finished...exiting"
 

Ici, je montre comment utiliser le module de threading pour créer un thread qui appelle une fonction normale en tant que cible. Vous pouvez voir comment je peux passer tous les arguments dont j'ai besoin dans le constructeur du thread.

49voto

Jorenko Points 1174

Il y a quelques problèmes avec votre code:

 def MyThread ( threading.thread ):
 
  • Vous ne pouvez pas sous-classe avec une fonction; seulement avec une classe
  • Si vous alliez utiliser une sous-classe, vous voudriez threading.Thread, pas threading.thread

Si vous voulez vraiment faire cela avec seulement des fonctions, vous avez deux options:

Avec filetage:

 import threading
def MyThread1():
    pass
def MyThread2():
    pass

t1 = threading.Thread(target=MyThread1, args=[])
t2 = threading.Thread(target=MyThread2, args=[])
t1.start()
t2.start()
 

Avec fil:

 import thread
def MyThread1():
    pass
def MyThread2():
    pass

thread.start_new_thread(MyThread1, [])
thread.start_new_thread(MyThread2, [])
 

4voto

Jeremy Brown Points 4950

Avez-vous remplacé la méthode run ()? Si vous avez ignoré __init__ , vous êtes-vous assuré d'appeler la base threading.Thread.__init__() ?

Après le démarrage des deux threads, le thread principal continue-t-il à travailler indéfiniment / bloquer / rejoindre sur les threads enfants afin que l'exécution du thread principal ne se termine pas avant que les threads enfants ne terminent leurs tâches?

Et enfin, obtenez-vous des exceptions non gérées?

4voto

unholysampler Points 9454

Vous pouvez utiliser l'argument target dans le constructeur Thread pour transmettre directement une fonction appelée à la place de run .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X