On Fri, May 28, 2021 at 4:49 AM Shreyan Avigyan
<pythonshreya...@gmail.com> wrote:
>
> Reply to Chris:
>
> The only problem is that with that approach that we can't understand if 
> that's the last yield statement. To achieve that we need to keep going until 
> we encounter a StopIteration. And the value of x would 3. Because we're not 
> iterating over a particular generator. We're creating multiple instances 
> which actually would increase x.
>
> And also is there another way we can make it thread safe? Steven's idea is 
> actually the only solution we've encountered till now. I'd be really happy if 
> someone could come up with even a better idea.
>

This is thread-safe:

from threading import Lock

lock = Lock()
counter = 0
def get_next():
    with lock:
        global counter
        counter += 1
        my_counter = counter
    ...
    ...
    ...

The equivalent with a static counter and a static Lock object would
also be thread-safe under my proposed semantics. This is guaranteed,
because ALL mutation happens while the lock is held, and then there's
a stack-local variable for the value you want to use. The language
promises that the assignment back to the global happens immediately,
not at some later point, after the lock has been released. This is, in
fact, the normal expectation of locks and assignment, and it works
whether you're using a global, a closure (and a nonlocal assignment),
a mutable function default argument, an attribute on the function
object, or in fact, *any other assignment in the language*. They all
happen immediately.

You would have to ensure that you don't have a yield inside the
locking context, but anywhere else would be fine.

The biggest downside of this sort of system is the overhead of the
locking. A high-performance thread-aware static system should be able
to avoid some or even most of that overhead. But mainly, the semantics
have to be such that locks behave sanely, and can be a solution to
other problems.

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/4FZD2HBRHB7XJPQBZRFOEXT5PMS4PYY4/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to