Is Stackless Python DEAD?

Donn Cave donn at u.washington.edu
Mon Oct 29 16:04:23 EST 2001


Quoth Paul Rubin <phr-n2001d at nightsong.com>:
| Donn Cave <donn at u.washington.edu> writes:
|>    #  callback from UI - selected login option
|>    def login(self):
|>        name = self.config.loginid
|>        password = self.getpassword(name)  # posts password prompt window
|>        #  Function actually returns from callback ...
|>        #  ... New callback arrives with password requested here;  continue!
|>        self.loginwithpassword(name, password)
|> 
|> That's arguably more readable than any alternative I ever thought of,
|> but then it substantially obscures the "real" flow of control in the
|> program.  
|
| Nice!  But really, using callbacks in the first place for things like
| this is a kludge designed to get around the lack of
| coroutines/continuations/threads whatever.  In threaded style you'd
| just write getpassword as an ordinary method call that blocks til
| the password is entered, then returns.

I'm probably missing something here, but note that this system is
built on a multi-threaded context already, and part of the game was
to put the whole system together on a purely I/O dispatched basis.
That message I/O, and the callback dispatching, is a basic given of
the underlying graphics toolkit, and it makes life a lot simpler if
the whole application is on board.

The function is based on something actually do, and I currently use
a version of it that does happen to block for the password.  In this
case, the caller spawns a password prompt interface with a semaphore,
then blocks waiting for the semaphore, then retrieves the password
from a common interlocked data store.  That sounds complicated, but
it's easy to make it work.

But what happens if the password prompt interface isn't a thread that
you can spawn every time you want one, but rather an element inside
a UI thread that;  and that UI thread happens to be asking you for
something that you'll need a password to answer?  You can't ask it
for the password, because it's asking you a question, and blocking
until you come up with an answer.  If all the parties just handle
I/O events and then return without blocking, we don't have that problem,
but in a simple procedural flow of control, the implementation gets
awkward because you have to divide the function into two, the second
one continuing with the password now in hand - and whatever state you
need, which has to be passed on from the first to the second function.
With Stackless' continuations, I could continue right back into the
middle of the function, with the state just where I left off, plus
the password value that came with the present callback.

If this still leaves you thinking that "coroutines/continuations/threads
whatever" would be a more obvious solution, could you elaborate?

	Donn Cave, donn at u.washington.edu



More information about the Python-list mailing list