qu'est-ce que l'utilisation de join() en python threading
J'étudiais le python threading et est venu à travers join()
.
L'auteur dit que si le thread est en mode démon puis-je utiliser join()
de sorte que le fil peut finir lui-même avant les principaux thread se termine.
mais j'ai aussi vu à l'aide de t.join()
même si t
n'était pas daemon
exemple de code est ce
import threading
import time
import logging
logging.basicConfig(level=logging.DEBUG,
format='(%(threadName)-10s) %(message)s',
)
def daemon():
logging.debug('Starting')
time.sleep(2)
logging.debug('Exiting')
d = threading.Thread(name='daemon', target=daemon)
d.setDaemon(True)
def non_daemon():
logging.debug('Starting')
logging.debug('Exiting')
t = threading.Thread(name='non-daemon', target=non_daemon)
d.start()
t.start()
d.join()
t.join()
je ne sais pas qu'est-ce que l'utilisation de t.join()
comme il n'est pas le démon et je ne vois pas de changement, même si je le supprime
- +1 pour le titre. "Rejoindre" semble être spécialement conçu pour encourager de mauvaises performances (par la création sans cesse/fin/à la destruction de threads), GUI de blocage, (en attente dans le cas des gestionnaires) et de l'application de l'arrêt des échecs, (en attente de secours threads terminer). Remarque - pas seulement en Python, c'est une croix de langue anti-modèle.
Vous devez vous connecter pour publier un commentaire.
Un peu maladroit ascii-art à démontrer le mécanisme:
Le
join()
est sans doute appelé par le thread. Elle pourrait également être appelée par un autre thread, mais serait inutilement compliquer le schéma.join
-l'appel doit être placé dans la voie de la main-thread, mais pour exprimer thread-relation et de le garder aussi simple que possible, j'ai choisi de le placer dans l'enfant-fil à la place.Donc la raison pour laquelle vous ne voyez pas toutes les modifications est parce que votre main-thread ne fait rien après votre
join
.On pourrait dire
join
est (seulement) pertinentes pour l'exécution des flux de main-thread.Si, par exemple, vous voulez simultanément télécharger un tas de pages à les concaténer dans une page unique, vous pouvez commencer à les téléchargements simultanés à l'aide de threads, mais il faut attendre jusqu'à la dernière page/thread est terminé avant de commencer l'assemblage d'une seule page de beaucoup de. C'est lorsque vous utilisez
join()
.demon_thread.join(0.0)
,join()
est par défaut, le verrouillage, sans égard à la automatiquement l'attribut. Mais en rejoignant un diabolisé fil s'ouvre le plus probable d'un ensemble de ennuis! Je suis en train d'envisager de retirer lajoin()
appel dans mon petit schéma pour le démon-fil...daemon=True
n'avons-nous pas besoin de l'join()
si nous avons besoin de lajoin()
à la fin du code?Directement à partir de la docs
Cela signifie que le thread principal, qui engendre le
t
etd
, attendt
pour finir jusqu'à la fin.Selon la logique de votre programme emploie, vous voudrez peut-être attendre jusqu'à ce qu'un thread se termine avant votre thread principal continue.
Également de la documentation:
Un exemple simple, supposons que nous avons ceci:
Qui se termine par:
Ce sera de sortie:
Ici, le maître fil explicitement attend le
t
fil à la finition jusqu'à ce qu'il appelleprint
la deuxième fois.Sinon, si nous avons eu cette:
Nous allons obtenir ce résultat:
Ici, nous faisons de notre travail dans le thread principal et puis nous attendons le
t
fil à la fin. Dans ce cas, on pourrait même supprimer l'explicite rejoindret.join()
et le programme implicitement attendret
à la fin.t.join()
. en ajoutant soome sommeil ou quelque chose d'autre. au moment où je peux voir tout chnage dans le programme même si je l'utilise ou pas. mais pour damemon je peux voir à sa sortie si j'utilised.join()
qui je ne vois pas quand je ne l'utilise pas d.join()Merci pour ce thread -- il m'a beaucoup aidé aussi.
J'ai appris quelque chose .join() aujourd'hui.
Ces threads s'exécutent en parallèle:
et ces exécutées de manière séquentielle (pas ce que je voulais):
En particulier, j'ai essayé de intelligent et bien rangé:
Cela fonctionne! Mais il s'exécute de manière séquentielle. Je peux mettre de l'auto.start() dans __ init __, mais pas de soi.join(). Ce qui doit être fait après chaque thread a été commencé.
join() est ce qui provoque le thread principal à attendre que votre fil à la fin. Sinon, le thread s'exécute de lui-même.
Donc une façon de penser join() comme une "prise" sur le thread principal -- il sorte de de-threads votre fil et exécute séquentiellement dans le thread principal, avant que le thread principal peut continuer. Il assure que votre fil est terminée avant que le thread principal se déplace vers l'avant. Notez que cela signifie que c'est ok si votre fil est déjà fini avant d'appeler le join() -- le thread principal est simplement libéré immédiatement lorsque join() est appelée.
En fait, tout à l'heure me semble que le thread principal attend à d.join() jusqu'à ce que le thread d finitions avant de passer à t.join().
En fait, pour être très clair, considérer ce code:
Il produit de cette sortie (note comment imprimer les relevés sont enfilés les uns dans les autres.)
Le t1.join() est maintenant en place le thread principal. Les trois fils se terminer avant que le t1.join() se termine et le thread principal se déplace à l'exécution de l'imprimer, puis t2.join (), puis les imprimer ensuite t3.join (), puis imprimer.
Corrections de bienvenue. Je suis également nouveau sur le filetage.
(Note: dans le cas où vous êtes intéressé, je suis à l'écriture de code pour un DrinkBot, et j'ai besoin de thread pour exécuter l'ingrédient pompes simultanément plutôt que de façon séquentielle -- moins de temps à attendre pour chaque boisson.)
La méthode join()
Source : http://docs.python.org/2/library/threading.html
t.join()
et le programme attend encore pour avant la fin de contrat. je ne vois pas de toute utilisation det.join()
ici dans mon codeLors de la prise de
join(t)
fonction pour les non-fil de démon et le démon thread, le thread principal (ou principal) doit attendret
secondes, alors vous pouvez aller plus loin pour travailler sur son propre processus. Au cours de lat
secondes de temps d'attente, les deux enfants threads doivent faire ce qu'ils peuvent faire, comme l'impression du texte. Après lat
secondes, si la non-démon thread n'a pas encore fini son travail, et il peut encore terminer après la fin du processus de son travail, mais pour le fil de démon, il a raté de peu sa fenêtre d'opportunité. Cependant, il finira par mourir après le programme python sorties. Veuillez me corriger si il ya quelque chose de mal.En python 3.x join() est utilisé pour joindre un thread avec le thread principal c'est à dire quand join() est utilisé pour un particulier thread le thread principal va s'arrêter jusqu'à ce que l'exécution de la rejoint le thread est terminé.
Simple À Comprendre,
avec join - interprète attendre jusqu'à ce que votre processus terminé ou résilié
sans jointure - interprète l'habitude d'attendre jusqu'à ce que le processus d'obtenir résilié,
Cet exemple démontrer la
.join()
action:Out:
"Quelle est l'utilité de l'aide de join()?" dites-vous. Vraiment, c'est la même réponse que "l'utilisation de la fermeture des fichiers, depuis le python et le système d'exploitation va se fermer mon fichier pour moi, lorsque mon programme s'arrête?".
C'est simplement une question de bonne programmation. Vous devriez vous joindre() de votre fils au point dans le code que le thread doit pas être en cours d'exécution plus, soit parce que vous positivement assurer le thread n'est pas en cours d'exécution pour interférer avec votre propre code, ou que vous souhaitez à se comporter correctement dans un système plus vaste.
Vous pourriez dire: "je ne veux pas que mon code pour le retard de donner une réponse" juste parce que le temps supplémentaire que le join() pourrait exiger. Cela peut être parfaitement valable dans certains scénarios, mais vous devez maintenant prendre en compte le fait que votre code est "laisser des trucs autour de python, et l'OS à nettoyer". Si vous faites cela pour des raisons de performances, je vous encourage fortement à document de comportement. Cela est particulièrement vrai si vous êtes la construction d'une bibliothèque/paquet que les autres sont censés utiliser.
Il n'y a pas de raison de ne pas rejoindre(), autres que des raisons de performances, et je dirais que votre code n'a pas besoin d'effectuer que bien.
join()
.