On Sun, Oct 15, 2017 at 10:10 PM, Guido van Rossum <gu...@python.org> wrote: > On Sun, Oct 15, 2017 at 8:17 PM, Nathaniel Smith <n...@pobox.com> wrote: >> >> On Sun, Oct 15, 2017 at 6:33 PM, Yury Selivanov <yselivanov...@gmail.com> >> wrote: >> > Stage 1. A new execution context PEP to solve the problem *just for >> > async code*. The PEP will target Python 3.7 and completely ignore >> > synchronous generators and asynchronous generators. It will be based >> > on PEP 550 v1 (no chained lookups, immutable mapping or CoW as an >> > optimization) and borrow some good API decisions from PEP 550 v3+ >> > (contextvars module, ContextVar class). The API (and C-API) will be >> > designed to be future proof and ultimately allow transition to the >> > stage 2. >> >> If you want to ignore generators/async generators, then I think you >> don't even want PEP 550 v1, you just want something like a >> {set,get}_context_state API that lets you access the ThreadState's >> context dict (or rather, an opaque ContextState object that holds the >> context dict), and then task schedulers can call them at appropriate >> moments. > > > Yes, that's what I meant by "ignoring generators". And I'd like there to be > a "current context" that's a per-thread MutableMapping with ContextVar keys. > Maybe there's not much more to it apart from naming the APIs for getting and > setting it? To be clear, I am fine with this being a specific subtype of > MutableMapping. But I don't see much benefit in making it more abstract than > that.
We don't need it to be abstract (it's fine to have a single concrete mapping type that we always use internally), but I think we do want it to be opaque (instead of exposing the MutableMapping interface, the only way to get/set specific values should be through the ContextVar interface). The advantages are: - This allows C level caching of values in ContextVar objects (in particular, funneling mutations through a limited API makes cache invalidation *much* easier) - It gives us flexibility to change the underlying data structure without breaking API, or for different implementations to make different choices -- in particular, it's not clear whether a dict or HAMT is better, and it's not clear whether a regular dict or WeakKeyDict is better. The first point (caching) I think is the really compelling one: in practice decimal and numpy are already using tricky caching code to reduce the overhead of accessing the ThreadState dict, and this gets even trickier with context-local state which has more cache invalidation points, so if we don't do this in the interpreter then it could actually become a blocker for adoption. OTOH it's easy for the interpreter itself to do this caching, and it makes everyone faster. -n -- Nathaniel J. Smith -- https://vorpus.org _______________________________________________ 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