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* unconstrained. -- Steven D'Aprano "Ever since I learned about confirmation bias, I've been seeing it everywhere." -- Jon Ronson -- https://mail.python.org/mailman/listinfo/python-list