I need a queue which multiple threads can put stuff into, and multiple threads may read from.
Python has at least two queue classes, Queue.Queue and collections.deque, with the former seemingly using the latter internally. Both claim to be thread-safe in the documentation.
However, the Queue docs also state:
collections.deque is an alternative implementation of unbounded queues with fast atomic append() and popleft() operations that do not require locking.
Which I guess I don't quite unterstand: Does this mean deque isn't fully thread-safe after all?
If it is, I may not fully understand the difference between the two classes. I can see that Queue adds blocking functionality. On the other hand, it loses some deque features like support for the in-operator.
Accessing the internal deque object directly, is
x in Queue().deque
thread-safe?
Also, why does Queue employ a mutex for it's operations when deque is thread-safe already?
RuntimeError: deque mutated during iteration
is what you could be getting is using a shareddeque
between several thread and no locking... – toinedeque
while iterating even in the same thread. The only reason you can't get this error fromQueue
is thatQueue
doesn't support iteration. – max