Are min() and max() thread-safe?
Miles Kaufmann
milesck at umich.edu
Thu Sep 17 02:59:19 EDT 2009
On Sep 16, 2009, at 10:39 PM, Steven D'Aprano wrote:
> On Wed, 16 Sep 2009 22:08:40 -0700, Miles Kaufmann wrote:
>
>> On Sep 16, 2009, at 9:33 PM, Steven D'Aprano wrote:
>>> I have two threads, one running min() and the other running max()
>>> over
>>> the same list. I'm getting some mysterious results which I'm having
>>> trouble debugging. Are min() and max() thread-safe, or am I doing
>>> something fundamentally silly by having them walk over the same list
>>> simultaneously?
>
>> min() and max() don't release the GIL, so yes, they are safe, and
>> shouldn't see a list in an inconsistent state (with regard to the
>> Python
>> interpreter, but not necessarily to your application). But a
>> threaded
>> approach is somewhat silly, since the GIL ensures that they *won't*
>> walk
>> over the same list simultaneously (two separate lists, for that
>> matter).
>
> Perhaps that's true for list contents which are built-ins like ints,
> but
> with custom objects, I can demonstrate that the two threads operate
> simultaneously at least sometimes. Unless I'm misinterpreting what I'm
> seeing.
Whoops, sorry. Yes, if you use Python functions (or C functions that
release the GIL) for the object comparison methods, a custom key
function, or the sequence iterator's methods, then the the min()/max()
calls could overlap between threads. If you have additional threads
that could modify the list, you should synchronize access to it; if
any of the earlier-mentioned functions modify the list, you're likely
to get "mysterious" (or at least potentially unexpected) results even
in a single-threaded context.
On Sep 16, 2009, at 10:41 PM, Niklas Norrthon wrote:
> For one time sequences like files and generators your code is broken
> for obvious reasons.
s/sequence/iterable/
-Miles
More information about the Python-list
mailing list