J'ai besoin d'une file d'attente dans laquelle plusieurs threads peuvent mettre des choses, et dans laquelle plusieurs threads peuvent lire.
Python possède au moins deux classes de files d'attente, Queue.Queue
y collections.deque
Le premier semble utiliser le second en interne. Les deux prétendent être thread-safe dans la documentation.
Cependant, la documentation sur les files d'attente indique également :
collections.deque est une implémentation alternative implémentation de files d'attente non limitées avec des opérations atomiques rapides de type append() et popleft() rapides et atomiques qui ne ne nécessitent pas de verrouillage.
Ce que je ne comprends pas très bien : Est-ce que cela signifie que deque n'est pas totalement thread-safe après tout ?
Si c'est le cas, je ne comprends peut-être pas bien la différence entre les deux classes. Je peux voir que Queue ajoute une fonctionnalité de blocage. D'un autre côté, elle perd certaines fonctionnalités deque comme le support de l'in-operator.
Accéder directement à l'objet interne deque, c'est
x dans Queue().deque
thread-safe ?
Aussi, pourquoi Queue utilise-t-il un mutex pour ses opérations alors que deque est déjà thread-safe ?
0 votes
RuntimeError: deque mutated during iteration
est ce que vous pourriez obtenir est d'utiliser un partagédeque
entre plusieurs fils et aucun verrouillage...7 votes
@toine ça n'a rien à voir avec les fils de discussion. Vous pouvez obtenir cette erreur à chaque fois que vous ajoutez/supprimez à un fichier
deque
tout en itérant même dans le même thread. La seule raison pour laquelle vous ne pouvez pas obtenir cette erreur à partir deQueue
c'est queQueue
ne prend pas en charge l'itération.0 votes
Si vous avez le livre "Effective Python", il y a une très bonne comparaison de Queue vs deque dans un cas d'utilisation multi-thread dans le point 55 ("Use Queue to Coordinate Work Between Threads").