Obtenez tous les éléments à partir du fil d'Attente
J'ai un thread qui écrit les résultats dans une File d'attente.
Dans un autre thread (GUI), je périodiquement (dans le cas d'INACTIVITÉ) vérifiez si il y a des résultats dans la file d'attente, comme ceci:
def queue_get_all(q):
items = []
while 1:
try:
items.append(q.get_nowait())
except Empty, e:
break
return items
Est-ce une bonne façon de le faire ?
Edit:
Je demande parce que, parfois, les
thread en attente de coincer un peu
secondes sans prendre de de nouvelles
résultats.
Les "coincés" problème s'est avéré être parce que je fais le traitement dans le vide gestionnaire d'événements, sans veiller à ce que ces événements sont en fait générée par l'appel de wx.WakeUpIdle
, comme il est recommandé.
OriginalL'auteur Eli Bendersky | 2008-10-01
Vous devez vous connecter pour publier un commentaire.
Je serais très surpris si la
get_nowait()
appel a causé la pause en ne renvoyant pas si la liste est vide.Pourrait-il que vous êtes à poster un grand nombre de (peut-être gros?) les éléments entre les contrôles, ce qui signifie que la réception de fil a une grande quantité de données pour la sortir de la
Queue
? Vous pourriez essayer de limiter le nombre que vous récupérez en un seul lot:Cela permettrait de limiter la réception de fil à tirer jusqu'à 10 documents à la fois.
Bon point de Brian. J'ai eu l'impression que eliben n'était pas à l'appel de cette que frequenctly, mais je peux me tromper - eliben?
Oups, vous avez raison, j'ai raté la partie à propos de l'appelant à l'arrêt de l'événement. Ce ne serait pas assez pour causer de tels problèmes.
OriginalL'auteur
Si vous êtes toujours en tirant tous les éléments disponibles de la file d'attente, est-il un réel intérêt à utiliser une file d'attente, plutôt que juste une liste avec une serrure? c'est à dire:
Si vous êtes également tirer individuellement, et en faisant usage de blocage de comportement pour les files d'attente vides, alors vous devriez utiliser la File d'attente, mais votre cas d'utilisation est beaucoup plus simple, et peut-être mieux servi par l'approche ci-dessus.
[Edit2] j'avais raté le fait que vous êtes d'interrogation de la file d'attente à partir d'une boucle d'inactivité, et à partir de votre mise à jour, je vois que le problème n'est pas lié à la contention, de sorte que le dessous approche n'est pas vraiment appropriée à votre problème. Je l'ai laissé dans le cas où quelqu'un trouve un blocage variante de cette utile:
Pour le cas où vous ne souhaitez bloquer jusqu'à ce que vous obtenez au moins un résultat, vous pouvez modifier le code ci-dessus à attendre que les données deviennent disponibles par le biais signalée par le producteur fil. Par exemple.
OriginalL'auteur
Je pense que la façon la plus simple d'obtenir tous les éléments de la file d'attente est la suivante:
juste curieux de ce qui se passe si il bloque?
le problème est que si il ne bloque PAS, et un autre thread essaie de faire quelque chose avec elle, en même temps, ce qui entraîne des exceptions ou d'autres mauvais comportement.
plus précisément, dans l'exemple ci-dessus un autre thread peut vider la file d'attente entre ce thread empty() et get() appelle, dans ce cas get() pourrait soulever un vide la file d'attente d'exception
OriginalL'auteur
Je vois que vous êtes en utilisant get_nowait() qui, selon la documentation, "retour[s] un élément, si on est immédiatement disponible, sinon augmenter le Vide exception"
Maintenant, il vous arrive de sortir de la boucle quand un Vide exception est levée. Ainsi, si il n'y a pas de résultat immédiatement disponible dans la file d'attente, votre fonction retourne un vide la liste des éléments.
Est-il une raison pourquoi vous n'êtes pas à l'aide de la méthode get() à la place? Il peut être le cas que le get_nowait() échoue parce que la file d'attente est l'entretien d'un put() demande à ce même instant.
OriginalL'auteur
Si vous avez terminé l'écriture de la file d'attente, qsize devrait faire l'affaire sans avoir besoin de vérifier la file d'attente pour chaque itération.
qsize
est similaire àempty
en ce qu'il n'est pas garanti. À partir de la documentation: de Retour de la taille de la file d'attente. Remarque, qsize() > 0 n'est pas une garantie subséquente d'un get() ne va pas bloquer, ni qsize() < maxsize garantir que put() ne va pas bloquer. docs.python.org/2/library/queue.htmlOriginalL'auteur