On Fri, May 28, 2021 at 4:14 AM Shreyan Avigyan <pythonshreya...@gmail.com> wrote: > > > A context switch can happen between any two of those instructions. > > That means one thread could load the global, then another thread could > > load the same value, resulting in both of them writing back the same > > incremented value. Or, between opcodes 6 and 8 (between the lines of > > Python code), you could store the value, then fetch back a different > > value. > > I see now. Then we can go with Steven's idea. Let's keep the changes in > locals temporarily and when it yields or returns then modify the __statics__ > member. And even if it's a generator it will stop iteration some time and if > it doesn't then the member wasn't meant to be modified. >
So you're saying that... def f(): static x = 0 x += 1 yield x next(f()) next(f()) next(f()) will yield 1 every time? According to the "write-back later" semantics, this is only going to actually update the static once it gets nexted the second time. This would be utterly unique in all of Python: that assignment doesn't happen when you say it should happen, it instead happens arbitrarily later. I would have to call that behaviour "buggy". If you use literally any other form of persistent state, ANY other, it would increment. Even worse: I don't see how your conclusion relates to my explanation of threading, which you describe. Instead of having a minor risk of a context switch in the middle of a statement (which can be controlled with a lock), you have a major risk of a context switch ANYWHERE in the function - and now there's no way you can use a lock to protect it, because the lock would (by definition) be released before the function epilogue. ChrisA _______________________________________________ Python-ideas mailing list -- python-ideas@python.org To unsubscribe send an email to python-ideas-le...@python.org https://mail.python.org/mailman3/lists/python-ideas.python.org/ Message archived at https://mail.python.org/archives/list/python-ideas@python.org/message/RJSWSPNCT35RJLGUM4L7LN3ETF5IHYJU/ Code of Conduct: http://python.org/psf/codeofconduct/