Fake threads (was [Python-Dev] ActiveState & fork & Perl)
Tim Peters
tim_one at email.msn.com
Tue Jun 29 06:16:34 CEST 1999
[Tim, claims not to understand Guido's
> While this seems possible at first, all blocking I/O calls would
> have to be redone to pass control to the thread scheduler, before
> this would be useful -- a huge task!
]
[Guido replies, sketching an elaborate scheme for making threads that
are fake nevertheless act like real threads in the particular case of
potentially blocking I/O calls]
> ...
> However in green threads (e.g. using Christian's stackless Python,
> where a thread switcher is easily added) the whole program would block
> at this point. The way to fix this is [very painful <wink>].
> ...
> Does this help? Or am I misunderstanding your complaint? Or is a
> <wink> missing?
No missing wink; I think it hinges on a confusion about the meaning of your
original word "useful".
Threads can be very useful purely as a means for algorithm structuring, due
to independent control flows. Indeed, I use threads in Python most often
these days without any hope or even *use* for potential parallelism
(overlapped I/O or otherwise). It's the only non-brain-busting way to write
code now that requires advanced control of the iterator, generator,
coroutine, or even independent-agents-in-a-pipeline flavors.
Fake threads would allow code like that to run portably, and also likely
faster than with the overheads of OS-level threads. For pedagogical and
debugging purposes too, fake threads could be very much friendlier than the
real thing. Heck, we could even run them on a friendly old Macintosh
<wink>.
If all fake threads block when any hits an I/O call, waiting for the latter
to return, we're no worse off than in a single-threaded program. Being
"fake threads", it *is* a single-threaded program, so it's not even a
surprise <wink>.
Maybe in your
Py_BEGIN_ALLOW_THREADS
n = read(fd, buffer, size);
Py_END_ALLOW_THREADS
you're assuming that some other Python thread needs to run in order for the
read implementation to find something to read? Then that's a dead program
for sure, as it would be for a single-threaded run today too. I can live
with that! I don't expect fake threads to act like real threads in all
cases.
My assumption was that the BEGIN/END macros would do nothing under fake
threads -- since there isn't a real thread backing it up, a fake thread
can't yield in the middle of random C code (Python has no way to
capture/restore the C state). I didn't picture fake threads working except
as a Python-level feature, with context switches limited to bytecode
boundaries (which a stackless ceval can handle with ease; the macro context
switch above is "in the middle of" some bytecode's interpretation, and while
"green threads" may be interested in simulating the that, Tim's "fake
threads" aren't).
different-threads-for-different-heads-ly y'rs - tim
More information about the Python-Dev
mailing list