Python - Threading et une Boucle While True
J'ai un fil qui ajoute des lignes de soi.de sortie et une boucle qui s'exécute jusqu'à ce que auto.fait est Vrai (ou le maximum de temps d'exécution est atteint).
Est-il un moyen plus efficace pour ce faire d'autre que d'utiliser une boucle while qui vérifie en permanence pour voir si c'est fait. La boucle while qui provoque la CPU pic à 100% alors qu'elle fonctionne..
time.clock()
while True:
if len(self.output):
yield self.output.pop(0)
elif self.done or 15 < time.clock():
if 15 < time.clock():
yield "Maximum Execution Time Exceeded %s seconds" % time.clock()
break
OriginalL'auteur Ian | 2009-04-30
Vous devez vous connecter pour publier un commentaire.
Sont à votre threads de l'ajout de l'auto.sortie ici, votre tâche principale de les consommer? Si oui, c'est un sur-mesure de l'emploi pour La file d'attente.La file d'attente. Votre code doit devenir quelque chose comme:
Votre threads producteurs ajouter des éléments dans la file d'attente avec
queue.put(item)
[Modifier] Le code original a une course de problème lors de la vérification de soi.fait (par exemple, plusieurs éléments peuvent être ajoutés à la file d'attente avant que le drapeau est réglé, provoquant le code pour renflouer sur le premier). Mis à jour avec une suggestion de ΤΖΩΤΖΙΟΥ - le producteur de fil à la place, ajouter un jeton spécial (Fini) de la file d'attente pour indiquer qu'il est complet.
Remarque: Si vous avez plusieurs threads producteurs, vous aurez besoin d'une approche plus générale de détecter quand ils sont tous finis. Vous pourriez faire cela avec la même stratégie - chaque thread a Fini marqueur et le consommateur s'arrête lorsqu'il voit num_threads marqueurs.
Est-il un moyen de dire à un blocage du thread sur une File d'attente.get() sans qu'un délai d'attente que le producteur est en fait de mettre n'importe quoi dans le fil de sorte qu'il pourrait quitter proprement?
Vous pouvez marquer le fil démoniaque lorsque vous le créez. Cela signifie que le fil de sortie lors de vos sorties de programme.
Le producteur de la File d'attente.mettre un marqueur spécial, c'est fait. Soit faire un
done_marker= object()
et de l'utiliser, ou vous pouvez utiliser le bouton de Sélection d'objet (autrement inutile, en général).Je note que votre exemple a une faille,
if self.done: break
devrait être changé en:if self.done and self.queue.empty(): break
, sinon le dernier élément de la file d'attente de l'habitude nécessairement être inclus. m'a fallu un peu de jouer avec elle pour comprendre cela.OriginalL'auteur Brian
Utilisation d'un sémaphore; le fil de presse quand il est terminé, et de bloquer votre ajoutant thread jusqu'à ce que le travailleur est fini avec le sémaphore.
ie. dans le travailleur, faire quelque chose comme
self.done = threading.Semaphore()
au début du travail, etself.done.release()
lorsque vous avez terminé. Dans le code que vous avez noté ci-dessus, au lieu de la boucle occupée, il suffit de faireself.done.acquire()
; lorsque le thread de travail est terminée, le contrôle sera de retour.Edit: j'ai peur de ne pas répondre à votre besoin de valeur de délai d'expiration, bien; ce question décrit la nécessité d'une temporisation de sémaphore dans la bibliothèque standard.
OriginalL'auteur esm
De temps d'utilisation.sommeil(en secondes) pour créer une brève pause après chaque itération de la boucle while de renoncer à la cpu. Vous devrez définir le temps de sommeil au cours de chaque itération basé sur combien il est important que vous attrapez le travail rapidement après il est complet.
Exemple:
OriginalL'auteur marcog
utilisation de mutex module ou de l'événement/le sémaphore
OriginalL'auteur Francis
Vous devez utiliser les primitives de synchronisation ici. Regardez ici: http://docs.python.org/library/threading.html.
Événement objets qui semblent très simples et devrait résoudre votre problème. Vous pouvez également utiliser un objet condition ou d'un sémaphore.
Je ne poste pas un exemple car je n'ai jamais utilisé les objets, et les alternatives sont sans doute moins simple.
Edit: je ne suis pas vraiment sûr que j'ai compris votre problème. Si un thread peut attendre jusqu'à ce qu'une certaine condition est statisfied, l'utilisation de la synchronisation. Sinon, le
sleep()
solution que quelqu'un a posté sur prendre trop de temps CPU.OriginalL'auteur Bastien Léonard