Faire une pause d'un thread à l'aide de filetage classe
J'ai un long processus que j'ai programmé pour s'exécuter dans un thread, parce que sinon il va geler l'interface utilisateur dans mon wxpython application.
Je suis en utilisant
threading.Thread(target = myLongProcess).start()
pour démarrer le thread et il fonctionne, mais je ne sais pas comment le mettre en pause et reprendre le fil. J'ai regardé dans le python docs pour les méthodes ci-dessus, mais n'était pas en mesure de les trouver.
Qui pourrait suggérer comment je pourrais faire cela?
Merci.
OriginalL'auteur jimbo | 2010-07-16
Vous devez vous connecter pour publier un commentaire.
J'ai eu le même problème moi-même, jusqu'à ce que j'ai trouvé la réponse.
J'ai fait quelques tests de vitesse ainsi, le temps de placer le drapeau et pour la prise de mesures est agréablement rapide 0.00002 secondes sur une lente 2 processeur Linux.
Exemple thread pause de test à l'aide de set() & clear() événements
Par De Riches O'Regan
Ce sont les plus heureux de commentaires et de sortie des chaînes que j'ai jamais vu.
OriginalL'auteur Rich
Il n'existe pas de méthode pour d'autres threads à force de mettre en pause un thread (pas plus que d'autres threads pour tuer ce thread) -- le thread cible doit coopérer à l'occasion certains de vérification appropriées "flags" (un
threading.Condition
pourrait être approprié pour le mettre en pause/reprendre le cas).Si vous êtes sur un unix-y la plate-forme (windows, essentiellement), vous pouvez utiliser
multiprocessing
au lieu dethreading
-- que est beaucoup plus puissant, et vous permet d'envoyer des signaux à l ' "autre procédé"; SIGSTOP inconditionnel de mettre en pause un processus et Son état continue (si votre processus a besoin de faire quelque chose juste avant de elle fait une pause, prendre aussi en considération la SIGTSTP signal, que les autres processus peut attraper d'effectuer une pré-suspension de fonctions. (Il peut y avoir des façons d'obtenir le même effet sur Windows, mais je ne suis pas informés à ce sujet, le cas échéant)."Envoyer un message" qui peut être fait littéralement par une File d'attente, mais (comme je l'ai dit) plus concrètement, pour ce cas, une Condition. Mais le thread cible doit vérifier périodiquement l'État (ou de la File d'attente) afin de recevoir "messages": il n'existe aucun moyen pour vous de le "forcer" à "recevoir les messages", vous devez vous code de cette façon explicite (probablement w/une boucle). Il n'existe aucun moyen pour les autres threads de force de faire un thread "recevoir des messages destinés", de jeter mon Un la première phrase, les termes vous semblent préférer. BTW, Windows est un
SuspendThread
API (cont.)Pour une solution spécifique, reportez-vous à msdn.microsoft.com/en-us/library/ms686345(SV.85).aspx - vous pouvez appeler les Api de Windows directement à partir de Python avec
ctypes
ou sourceforge.net/projects/pywin32 .OriginalL'auteur Alex Martelli
Vous pouvez utiliser des signaux: http://docs.python.org/library/signal.html#signal.pause
Pour éviter l'utilisation de signaux vous pouvez utiliser un jeton de passage du système. Si vous voulez mettre en pause à partir de l'INTERFACE principale fil, vous pourriez probablement utiliser une File d'attente.File d'attente de l'objet à communiquer avec elle.
Juste pop un message indiquant le fil sommeil pour une certaine quantité de temps sur la file d'attente.
Sinon, vous pouvez simplement continuellement pousser les jetons sur la file d'attente de l'INTERFACE utilisateur principale thread. Le travailleur doit juste vérifier la file d'attente toutes les N secondes (0,2 ou quelque chose comme ça). Quand il n'y a pas de jetons à retirer le thread se bloque. Si vous voulez recommencer juste commencer à pousser les jetons sur la file d'attente du thread principal de nouveau.
signal.pause
seul moyen du processus de l'appel dort jusqu'à ce qu'un signal est reçu-pas de l'utiliser pour la demande du commettant. Voir ma réponse pour la bonne approche.merci pour la clarification. Le signal d'une partie de ma réponse a été un coup.. cheers 🙂
OriginalL'auteur dpn
Le multitraitement module fonctionne très bien sur Windows. Voir la documentation ici (fin du premier paragraphe):
http://docs.python.org/library/multiprocessing.html
Sur le wxPython canal IRC, nous avons eu un couple de boursiers en essayant de multitraitement et ils ont dit qu'il a travaillé. Malheureusement, je n'ai pas encore vu quelqu'un qui a écrit un bon exemple de multitraitement et wxPython.
Si vous (ou quelqu'un d'autre ici) venir avec quelque chose, merci de l'ajouter à la wxPython page wiki sur le filetage ici: http://wiki.wxpython.org/LongRunningTasks
Vous pourriez vouloir vérifier que la page quelle que soit la il a plusieurs exemples intéressants en utilisant des fils et des files d'attente.
OriginalL'auteur Mike Driscoll
Vous pouvez prendre un coup d'oeil à la API de Windows pour le fil de suspension.
Autant que je suis conscient qu'il n'existe pas de POSIX/pthread équivalent. En outre, je ne peux pas vérifier si les poignées de thread/Id sont disponible à partir de Python. Il y a aussi des problèmes potentiels avec Python, comme la planification est effectuée à l'aide de la maternelle planificateur, il est peu probable qu'il s'attend à des threads de suspendre, en particulier si les threads suspendu tout en maintenant le GIL, entre autres possibilités.
OriginalL'auteur Matt Joiner