10
votes

Python: Pourquoi une partie de la méthode de la file d'attente.Queue "peu fiable"?

dans la queue de la classe dans le module File d'attente , il existe quelques méthodes, nommément, qsize , vide et complet , dont la documentation prétend qu'ils sont "non fiables".

Qu'est-ce qui n'est pas exactement fiable à leur sujet?

J'ai remarqué que sur le site Python Docs , on dit ce qui suit sur < Code> QSIZE :

note, qsize ()> 0 ne garantit pas qu'un get ultérieur () ne sera pas bloc, ni qsize ()

Je ne considère personnellement pas ce comportement "peu fiable". Mais est-ce ce qu'on entend "peu fiable," ou existe-t-il encore plus de défaut sinistre dans ces méthodes?


7 commentaires

Un lien vers les documents spécifiques que vous faites référence serait bien.


La documentation est inutile. Vous ne pouvez pas simplement dire «cette fonction n'est pas fiable» dans la documentation; Vous devez dire exactement ce qui est peu fiable à ce sujet.


Nul doute docs.python.org/library/queue.html .


@Glenn, s'il vous plaît regardez docs.python.org/library/quue.html : Les mots "fiables" et "peu fiables" n'apparaissent pas là. Les doctorants concis, une ligne de ligne dans le code utilisent "non fiable" comme sténographie utile et, bien sûr, vous allez au manuel pour des détails complets: il est loin de inutile pour avoir de courts résumés disponibles dans le Code elles-mêmes en outre _ dans la description complète dans le manuel.


En fait, la documentation actuelle (Google m'a-t-elle liée à l'ancien) a remplacé les 2,5 documents qui ont fait, très clairement, disent "pas fiable" ( python.org/doc/2.5.2/lib/QueueObject.html ). Clairement Python, les gens sont d'accord avec moi, puisqu'ils ont remplacé le texte inutile 2.5 avec une description réelle. Perdre l'attitude et faire pas me confondez-moi.


Documents actuels: python.org/doc/current/Library/queue .html # file d'attente-objets .


@Glenn, cool-rr: la documentation actuelle sur la file d'attente.qSize (), vide (), complète () peut certainement être améliorée pour dire que les mises en garde habituelles sur le comportement multiples s'appliquent et lient à la sections appropriées. Voici Comment soumettre un bogue de documentation . Je pense que ça vaut la peine de soumettre.


3 Réponses :


2
votes

Je ne sais pas quel module de file d'attente vous parlez, s'il vous plaît pouvez-vous fournir un lien?

Une source de manque de fiabilité possible: généralement une file d'attente est lue par un fil et écrit par un autre. Si vous êtes le seul fil accédant à une file d'attente, les implémentations fiables de QSize (), vides () et pleines () sont possibles. Mais une fois que d'autres threads sont impliqués, la valeur de retour de ces méthodes pourrait être obsolète au moment où vous le testez.


3 commentaires

Queue.py, partie de la bibliothèque standard.


Il y a un module Queue.py dans la bibliothèque standard de Python, j'ai ajouté des commentaires à la question à proposer à ses documents. Source est chez svn.python.org/view/python /trunk/lib/queue.py?view=markup .


Ah Ok, je supposais bêtement que la file d'attente ne pouvait pas être dans le stdlib car elle ne se conforme pas aux conventions de nommage PP8. Je suppose que c'est une exception. Merci pour le lien!



11
votes

Oui, les documents utilisent "peu fiable" ici pour transmettre exactement ce sens: par exemple, dans un sens, qsize ne vous dit pas combien d'entrées il y a "en ce moment", un concept ce n'est pas nécessairement très significatif dans un monde multithread (sauf à des points spécifiques dans lesquels des précautions de synchronisation sont prises) - il vous indique combien d'entrées qu'il avait «il y a quelque temps» ... lorsque vous agissez sur cette information, même dans le Très prochain opcode, la file d'attente pourrait avoir plus d'entrées ou moins, ou aucune, ou aucune autre peut-être, selon les autres threads, entre-temps entre-temps (si quelque chose; -).


4 commentaires

"Non fiable" suggère un certain nombre de problèmes. Ces fonctions doivent être complètement fiables pour certains cas d'utilisation (par exemple, détecter si un insert pourrait bloquer, d'une file d'attente avec un seul fil de producteur). "Peu fiable" n'a pas de sens.


@Alex Martelli: Comment la taille peut-elle rapportée par QSize n'est-elle pas la taille actuelle? Après tout, l'appelant de QSize détient le mutex, ce qui signifie que c'est le seul fil accédant à la file d'attente à ce moment-là. Ou utilisez le terme "maintenant" comme dans "droit après vous avez fini d'appeler qsize"?


C'est la taille "Retour quand" le fil de l'appelant tenait le mutex - qui est publié (dans un enfin ) dans la partie du retour ; C'est un instant plus tôt que l'instant dans lequel le code d'appel dans le fil de l'appelant reçoit le résultat. Le "en ce moment" est l'instant dans lequel le résultat est lié à une variable ou utilisé de toute autre manière que ce soit: à ce moment-là, le résultat est lié ou utilisé autrement pourrait déjà être obsolète.


@Glenn, voir ma réponse Commentaire à votre commentaire sur la question: Loin de signification ou inutile, les résumés extrêmement concis en question utilement et signifient de manière significative au lecteur des explications beaucoup plus détaillées dans le manuel. par exemple. Même si complet est vrai qui ne signifie pas que vous bloquerez même dans un seul scénario de producteur ... il pourrait ne pas être vrai plus le prochain instant suivant (dans ce cas extrêmement spécialisé, vous ne connaissez aucun autre fil Causer la fausse-> vraie transition, mais vous ne connaissez pas la vraie transition même dans un scénario aussi artificiel ! -).



0
votes

C'est un cas de manque de fiabilité conforme à ce que Alex Martelli a suggéré: Joinablequeur.empty () non fiable? Quelle est l'alternative?


0 commentaires