What kind of "thread safe" are deque's actually?

Chris Angelico rosuav at gmail.com
Wed Mar 29 02:08:21 EDT 2023


On Wed, 29 Mar 2023 at 16:56, Greg Ewing via Python-list
<python-list at python.org> wrote:
>
> On 28/03/23 2:25 pm, Travis Griggs wrote:
> > Interestingly the error also only started showing up when I switched from running a statistics.mean() on one of these, instead of what I had been using, a statistics.median(). Apparently the kind of iteration done in a mean, is more conflict prone than a median?
>
> It may be a matter of whether the GIL is held or not. I had a look
> at the source for deque, and it doesn't seem to explicitly do
> anything about locking, it just relies on the GIL.
>
> So maybe statistics.median() is implemented in C and statistics.mean()
> in Python, or something like that?
>

Both functions are implemented in Python, but median() starts out with
this notable line:

    data = sorted(data)

which gives back a copy, iterated over rapidly in C. All subsequent
work is done on that copy.

The same effect could be had with mean() by taking a snapshot using
list(q) and, I believe, would have the same effect (the source code
for the sorted() function begins by calling PySequence_List).

In any case, it makes *conceptual* sense to do your analysis on a copy
of the queue, thus ensuring that your stats are stable. The other
threads can keep going while you do your calculations, even if that
means changing the queue.

ChrisA


More information about the Python-list mailing list