[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Thread-safe way to add a key to a dict only if it isn't already there?

On Sun, 08 Jul 2018 11:15:17 +1000, Chris Angelico wrote:

> Python threads don't switch only between lines of code, 

As I understand it, there could be a switch between any two byte codes, 
or maybe only between certain bytes codes. But certain more fine grained 
than just between lines of code.

> so the actual
> interaction is a bit more complicated than you say. In CPython, the
> increment operation is:
>   3           0 LOAD_GLOBAL              0 (i)
>               2 LOAD_CONST               1 (1)
>               4 INPLACE_ADD
>               6 STORE_GLOBAL             0 (i)
> A context switch could happen between any pair of statements.

If you actually mean *statements* as opposed to byte codes, then the only 
place there could be a switch would be either before the LOAD_GLOBAL or 
after the STORE_GLOBAL (given that i is a built-in int and cannot have a 
custom __iadd__ method).

Is that what you mean?

> In this
> particular example, the end result doesn't change - coherent results are
> 2 and 3, nothing else - but in other situations, there may be times when
> the separate steps might be significant.

Fortunately I wasn't talking about other code snippets, only the one 
shown :-)

> For instance, if you replace "i
> += 1" with "i += i", to double the value, you'll get this:
>   3           0 LOAD_GLOBAL              0 (i)
>               2 LOAD_GLOBAL              0 (i)
>               4 INPLACE_ADD
>               6 STORE_GLOBAL             0 (i)
> and that could potentially have both of them load the initial value,
> then one of them runs to completion, and then the other loads the result
> - so it'll add 1 and 2 and have a result of 3, rather than 2 or 4.

Some people, when confronted with a problem, say, "I know, I'll use 
threads". Nothhtwo probw ey ave lems.

> But you're absolutely right that there are only a small handful of
> plausible results, even with threading involved.

Indeed. Even though threading is non-deterministic, it isn't *entirely* 

Steven D'Aprano
"Ever since I learned about confirmation bias, I've been seeing
it everywhere." -- Jon Ronson