On Mon, Aug 28, 2017 at 1:33 PM, Stefan Krah <ste...@bytereef.org> wrote:
[..]
>> * Context managers like decimal contexts, numpy.errstate, and
>> warnings.catch_warnings.
>
> The decimal context works like this:
>
>   1) There is a default context template (user settable).
>
>   2) Whenever the first operation *in a new thread* occurs, the
>      thread-local context is initialized with a copy of the
>      template.
>
>
> I don't find it very intuitive if setcontext() is somewhat local in
> coroutines but they don't participate in some form of CLS.
>
> You have to think about things like "what happens in a fresh thread
> when a coroutine calls setcontext() before any other decimal operation
> has taken place".

I'm sorry, I don't follow you here.

PEP 550 semantics:

setcontext() in a regular code would set the context for the whole thread.

setcontext() in a coroutine/generator/async generator would set the
context for all the code it calls.

> So perhaps Nathaniel is right that the PEP is not so useful for numpy
> and decimal backwards compat.

Nathaniel's argument is pretty weak as I see it. He argues that some
people would take the following code:

    def bar():
       # set decimal context

    def foo():
       bar()
       # use the decimal context set in bar()

and blindly convert it to async/await:

    async def bar():
       # set decimal context

    async def foo():
       await bar()
       # use the decimal context set in bar()

And that it's a problem that it will stop working.

But almost nobody converts the code by simply slapping async/await on
top of it -- things don't work this way. It was never a goal for
async/await or asyncio, or even trio/curio.  Porting code to
async/await almost always requires a thoughtful rewrite.

In async/await, the above code is an *anti-pattern*.  It's super
fragile and can break by adding a timeout around "await bar".  There's
no workaround here.

Asynchronous code is fundamentally non-local and a more complex topic
on its own, with its own concepts: Asynchronous Tasks, timeouts,
cancellation, etc.  Fundamentally: "(synchronous code) !=
(asynchronous code) - (async/await)".

Yury
_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
https://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to