Petr, thanks for clearly stating your interests and goals for
subinterpreters. This lays to rest some of my own fears. I am still
skeptical that (even after the GIL is separated) they will enable
multi-core in ways that multiple processes couldn't handle just as well or
better, but your clear statement that *embedding* is the more important use
case helps me feel supportive of the concept.

On Tue, Jun 9, 2020 at 6:26 AM Petr Viktorin <encu...@gmail.com> wrote:

> On 2020-06-05 16:32, Mark Shannon wrote:
> > Hi,
> >
> > There have been a lot of changes both to the C API and to internal
> > implementations to allow multiple interpreters in a single O/S process.
> >
> > These changes cause backwards compatibility changes, have a negative
> > performance impact, and cause a lot of churn.
> >
> > While I'm in favour of PEP 554, or some similar model for parallelism in
> > Python, I am opposed to the changes we are currently making to support
> it.
> >
> >
> > What are sub-interpreters?
> > --------------------------
> >
> > A sub-interpreter is a logically independent Python process which
> > supports inter-interpreter communication built on shared memory and
> > channels. Passing of Python objects is supported, but only by copying,
> > not by reference. Data can be shared via buffers.
>
> Here's my biased take on the subject:
>
> Interpreters are contexts in which Python runs. They contain
> configuration (e.g. the import path) and runtime state (e.g. the set of
> imported modules). An interpreter is created at Python startup
> (Py_InitializeEx), and you can create/destroy additional ones with
> Py_NewInterpreter/Py_EndInterpreter.
> This is long-standing API that is used, most notably by mod_wsgi.
>
> Many extension modules and some stdlib modules don't play well with the
> existence of multiple interpreters in a process, mainly because they use
> process-global state (C static variables) rather than some more granular
> scope.
> This tends to result in nasty bugs (C-level crashes) when multiple
> interpreters are started in parallel (Py_NewInterpreter) or in sequence
> (several Py_InitializeEx/Py_FinalizeEx cycles). The bugs are similar in
> both cases.
>
> Whether Python interpreters run sequentially or in parallel, having them
> work will enable a use case I would like to see: allowing me to call
> Python code from wherever I want, without thinking about global state.
> Think calling Python from an utility library that doesn't care about the
> rest of the application it's used in. I personally call this "the Lua
> use case", because light-weight, worry-free embedding is an area where
> Python loses to Lua. (And JS as well—that's a relatively recent
> development, but much more worrying.)
>
> The part I have been involved in is moving away from process-global
> state. Process-global state can be made to work, but it is much safer to
> always default to module-local state (roughly what Python-language's
> `global` means), and treat process-global state as exceptions one has to
> think through. The API introduced in PEPs 384, 489, 573 (and future
> planned ones) aims to make module-local state possible to use, then
> later easy to use, and the natural default.
>
> Relatively recently, there is an effort to expose interpreter creation &
> finalization from Python code, and also to allow communication between
> them (starting with something rudimentary, sharing buffers). There is
> also a push to explore making the GIL per-interpreter, which ties in to
> moving away from process-global state. Both are interesting ideas, but
> (like banishing global state) not the whole motivation for
> changes/additions. It's probably possible to do similar things with
> threads or subprocesses, sure, but if these efforts went away, the other
> issues would remain.
>
> I am not too fond of the term "sub-interpreters", because it implies
> some kind of hierarchy. Of course, if interpreter creation is exposed to
> Python, you need some kind of "parent" to start the "child" and get its
> result when done. Also, due to some practical issues you might (sadly,
> currently) need some notion of "the main interpreter". But ideally, we
> can make interpreters entirely independent to allow the "Lua use case".
> In the end-game of these efforts, I see Py_NewInterpreter transparently
> calling Py_InitializeEx if global state isn't set up yet, and similarly,
> Py_EndInterpreter turning the lights off if it's the last one out.
> _______________________________________________
> Python-Dev mailing list -- python-dev@python.org
> To unsubscribe send an email to python-dev-le...@python.org
> https://mail.python.org/mailman3/lists/python-dev.python.org/
> Message archived at
> https://mail.python.org/archives/list/python-dev@python.org/message/NLITVUIZQSUJ2F6XDTPMD7IP7FGTMNBA/
> Code of Conduct: http://python.org/psf/codeofconduct/
>


-- 
--Guido van Rossum (python.org/~guido)
*Pronouns: he/him **(why is my pronoun here?)*
<http://feministing.com/2015/02/03/how-using-they-as-a-singular-pronoun-can-change-the-world/>
_______________________________________________
Python-Dev mailing list -- python-dev@python.org
To unsubscribe send an email to python-dev-le...@python.org
https://mail.python.org/mailman3/lists/python-dev.python.org/
Message archived at 
https://mail.python.org/archives/list/python-dev@python.org/message/LXG5JAK7W5WLZJ66L4S6V676Z62VXC2A/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to