[Python-ideas] set.add could return True or False

Jacob Holm jh at improva.dk
Fri Mar 16 12:37:24 CET 2012


On 03/14/2012 06:46 PM, Andrew Svetlov wrote:
> You still can get race condition:
>
> if b.add(a):
>     # some thread removes a from b before do_c call...
>     do_c()
>
> Explicit lock is still required for your case.
>

A common use for this pattern is to do some piece of work only the first 
time a given value is seen.  The race condition you mention is unlikely 
to matter there because either:

- Values are never removed from b, and so there is no race, or
- Values are only ever removed by do_c, so there is no race, or
- Whether a is actually *in* b is irrelevant to do_c.

The original race *does* matter, because do_c() may be called multiple 
times for the same value.  Changing set.add() to return True if the 
value was actually added fixes this race condition without using locks.

In fact, you could even use the proposed feature to *implement* a form 
of (non-reentrant, nonblocking) locking.  If you need a lot of locks, it 
would even be cheaper (at least memory-wise) than using threading.Lock 
objects.  Having to use a "real" lock to avoid the race condition makes 
that approach a lot less attractive.

- Jacob


> On Wed, Mar 14, 2012 at 10:36 AM, Matt Joiner<anacrolix at gmail.com>  wrote:
>> set.add(x) could return True if x was added to the set, and False if x
>> was already in the set.
>>
>> Adding an element that is already present often constitutes an error in my code.
>>
>> As I understand, set.add is an atomic operation. Having set.add return
>> a boolean will also allow EAFP-style code with regard to handling
>> duplicates, the long winded form of which is currently:
>>
>> if a not in b:
>>     b.add(a)<-- race condition
>>     do_c()
>>
>> Which can be improved to:
>>
>> if b.add(a):
>>     do_c()
>>
>> Advantages:
>>   * Very common code pattern.
>>   * More concise.
>>   * Allows interpreter atomicity to be exploited, often removing the
>> need for additional locking.
>>   * Faster because it avoids double contain check, and can avoid locking.
>> _______________________________________________
>> Python-ideas mailing list
>> Python-ideas at python.org
>> http://mail.python.org/mailman/listinfo/python-ideas
> _______________________________________________
> Python-ideas mailing list
> Python-ideas at python.org
> http://mail.python.org/mailman/listinfo/python-ideas



More information about the Python-ideas mailing list