[Stackless] [threading] Stackless based replacement

Jeff Senn senn at maya.com
Fri Sep 26 16:54:16 CEST 2008


On Sep 26, 2008, at 9:50 AM, David Naylor wrote:
>>
>
> My atomic is based on .set_atomic, and there should not be any  
> explicit
> passing of control.  I compensated for it [the apparent bug?] by  
> forcing a
> reschedule until the correct tasklet came about...
>
> Unfortunately my code that generates this problem is FreeBSD based  
> and will
> only work with FreeBSD Ports (If you have I will gladly send you the  
> code).

Doesn't help me. :-(

>>> 2) Will stackless switch to another tasklet when entering blocking
>>> routines
>>> (like IO), I know threads do this...
>>
>> No it won't.  In fact, it fundamentally *can't* (since it "runs" in
>> only one thread).
>
> Surely there is a way around this?  Some kind of pooling select?  If  
> there is

Well... not, not tractably.  Realize the tasklets are very bound to  
the thread
they are running within.  If that thread is busy in I/O... then it's  
not going
to be able to switch to another tasklet.  ....

> no work around then I cannot see too much practical use for my  
> thread library
> [except having to avoid learning tasklets for someone who is  
> familiar with
> threads].


> As I understand it, due to the GIL the only real practical use for
> threads is if one has blocking function calls (IO-type, etc)

Indeed.
(or extensions running w/o the GIL)
This broader issue has been discussed several times on this list,
if you are interested you might want to go through the archives.

> [Has the GIL restriction been fixed in 3k?

Heh!  No.   And it probably won't be:
http://www.artima.com/weblogs/viewpost.jsp?thread=214235

>>> Did you mean "threads" or "tasklets"?
>
> Threads
>
>> If you meant "threads" the answer is complicated... if you meant
>> "tasklets"
>> then see the parameter to stackless.run.
>
> I asked because I remember somewhere that python does a 'switch'  
> every X
> lines...  I just wanted to pass the same number to run().

There is some loop counter in eval (that I believe defaults to 100) that
affects the granularity of thread switching (by giving up the GIL every
N iterations) -- this does not really map to "lines" however.

If you actually wanted stackless to autoschedule this fast I believe
you would:

stackless.run(1)

since the number passed to run is "layered" on the eval loop counter.

-Jas






More information about the Stackless mailing list