Création de Threads en python
J'ai un script et je veux qu'une fonction s'exécute en même temps que l'autre.
Exemple de code que j'ai regardé:
import threading
def MyThread ( threading.thread ):
doing something........
def MyThread2 ( threading.thread ):
doing something........
MyThread().start()
MyThread2().start()
J'ai du mal à faire fonctionner ça. Je préférerais que cela se passe en utilisant une fonction threadée plutôt qu'une classe.
Merci pour toute aide.
C'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'
5 réponses
Vous n'avez pas besoin d'utiliser une sous-classe de Thread
pour faire ce travail-jetez un oeil à l'exemple simple que je poste 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 threading pour créer un thread qui appelle une fonction normale comme cible. Vous pouvez voir comment je peux passer tous les arguments dont j'ai besoin dans le constructeur de thread.
, Il existe quelques problèmes avec votre code:
def MyThread ( threading.thread ):
- Vous ne pouvez pas sous-classer avec une fonction; seulement avec une classe
- Si vous deviez utiliser une sous-classe, vous voudriez un threading.Fil, pas de filetage.fil
Si vous voulez vraiment le faire 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, ())
Doc pour thread.start_new_thread
J'ai essayé d'ajouter une autre join (), et cela semble fonctionner. Voici le code
from threading import Thread
from time import sleep
def function01(arg,name):
for i in range(arg):
print(name,'i---->',i,'\n')
print (name,"arg---->",arg,'\n')
sleep(1)
def test01():
thread1 = Thread(target = function01, args = (10,'thread1', ))
thread1.start()
thread2 = Thread(target = function01, args = (10,'thread2', ))
thread2.start()
thread1.join()
thread2.join()
print ("thread finished...exiting")
test01()
Vous pouvez utiliser l'argument target
dans le constructeur Thread
pour transmettre directement une fonction appelée à la place de run
.
Avez-vous remplacé la méthode run ()? Si vous avez remplacé __init__
, Vous êtes-vous assuré d'appeler la base threading.Thread.__init__()
?
Après avoir démarré les deux threads, le thread principal continue-t-il à fonctionner indéfiniment/block/join sur les threads enfants afin que l'exécution du thread principal ne se termine pas avant que les threads enfants n'aient terminé leurs tâches?
Et enfin, obtenez-vous des exceptions non gérées?