[Python-Dev] Re: [Stackless] comments on PEP 219
Gordon McMillan
gmcm@hypernet.com
Tue, 13 Mar 2001 12:17:39 -0500
[Jeremy]
> Here are some comments on Gordon's new draft of PEP 219 and the
> stackless dev day discussion at Spam 9.
>
> I left the dev day discussion with the following takehome
> message: There is a tension between Stackless Python on the one
> hand and making Python easy to embed in and extend with C
> programs on the other hand. The PEP describes this as the major
> difficulty with C Python. I won't repeat the discussion of the
> problem there.
Almost all of the discussion about interpreter recursions is
about completeness, *not* about usability. If you were to
examine all the Stackless using apps out there, I think you
would find that they rely on a stackless version of only one
builtin - apply().
I can think of 2 practical situations in which it would be *nice*
to be rid of the recursion:
- magic methods (__init__, __getitem__ and __getattr__ in
particular). But magic methods are a convenience. There's
absolutely nothing there that can't be done another way.
- a GUI. Again, no big deal, because GUIs impose all kinds of
restrictions to begin with. If you use a GUI with threads, you
almost always have to dedicate one thread (usually the main
one) to the GUI and be careful that the other threads don't
touch the GUI directly. It's basically the same issue with
Stackless.
As for the rest of the possible situations, demand is
nonexistant. In an ideal world, we'd never have to answer the
question "how come it didn't work?". But put on you
application programmers hat for a moment and see if you can
think of a legitimate reason for, eg, one of the objects in an
__add__ wanting to make use of a pre-existing coroutine
inside the __add__ call. [Yeah, Tm can come up with a
reason, but I did say "legitimate".]
> I would like to seem a somewhat more detailed discussion of this
> in the PEP. I think it's an important issue to work out before
> making a decision about a stack-light patch.
I'm not sure why you say that. The one comparable situation
in normal Python is crossing threads in callbacks. With the
exception of a couple of complete madmen (doing COM
support), everyone else learns to avoid the situation. [Mark
doesn't even claim to know *how* he solved the problem
<wink>].
> The problem of nested interpreters and the C API seems to come up
> in several ways. These are all touched on in the PEP, but not in
> much detail. This message is mostly a request for more detail
> :-).
>
> - Stackless disallows transfer out of a nested interpreter.
> (It
> has, too; anything else would be insane.) Therefore, the
> specification for microthreads &c. will be complicated by a
> listing of the places where control transfers are not
> possible. The PEP says this is not ideal, but not crippling.
> I'd like to see an actual spec for where it's not allowed in
> pure Python. It may not be crippling, but it may be a
> tremendous nuisance in practice; e.g. remember that __init__
> calls create a critical section.
The one instance I can find on the Stackless list (of
attempting to use a continuation across interpreter
invocations) was a call the uthread.wait() in __init__. Arguably
a (minor) nuisance, arguably bad coding practice (even if it
worked).
I encountered it when trying to make a generator work with a
for loop. So you end up using a while loop <shrug>.
It's disallowed where ever it's not accomodated. Listing those
cases is probably not terribly helpful; I bet even Guido is
sometimes surprised at what actually happens under the
covers. The message "attempt to run a locked frame" is not
very meaningful to the Stackless newbie, however.
[Christian answered the others...]
- Gordon