[Stackless] integrate stackless with other event driven framework: merge two

Jimsfba at aol.com Jimsfba at aol.com
Sat Oct 14 19:26:14 CEST 2006


Richard, thank you for the comment. For CCP game's custom yielding  approach, 
I got a question: when finish the work in stackless world and  switching to 
another world (the other event driven framework, C++ watchdog for  low level 
tcp/file io, etc), how long it want to stay there before switching  back to 
stackless world ?
 
- If the approach is "stay only when it has job to do", then when the two  
event driven frameworks are idle (no job to do), the code will be busy switching 
 between the two frameworks again and again. It can cause a fast tight loop 
with  up to 99% cpu usage.
 
- If the approach is "always stay for x hundreds millisecond", then that "x  
hundreds millisecond" is wasted when framework we are waiting has no job for 
us  to do.
 
The wild guess that stackless internally (at system call level) is blocking  
at select()/ poll() call (after finish all callback jobs it need to do), 
because  that's only way I can think of (in Unix part of implementation) which can  
listening/bockling on many different events queues without using a tight loop 
to  scan all of them. If stackless use a different way to do it at unix 
system call  level,  can someone shed some light with more info ? 
 
Thanks again.
 
- Jim
 

On 10/14/06 Richard Tew richard.m.tew at gmail.com wrote:
 
> I have a C++ event driven main loop framework that embedded the  stackless
> framework.
> The only way I can make these two framework  work together is: switching
> between two frameworks in a fix time  range.
>
> 1. timeout the select() call in my C++ main loop every  few hundreds
> milliseconds,
> 2. give a few hundress millisecond  for stackless code to run:
>    watchdogHandle =
>  handle<>(allow_null(PyStackless_RunWatchdog(1000)));
 
This runs for around 1000 instructions.  Which means that it will not  exit
the currently running tasklet where you explicitly cooperatively  schedule
or yield using some other manner, but in a preemptive manner.   As long as
you know that.
 
At CCP Games we take a different approach, which you can read about  in
the slideshow Kristján Jónsson gave at PyCon 2006. Instead of  interrupting
the permanently scheduled tasklets, we use custom yielding  methods (BeNice,
Sleep or on a channel waiting for an event) and never  schedule to divert
all the scheduled tasklets so that it is natural for all  tasklets that have
been scheduled to run once and then the scheduler will be  empty.  At which
point the watchdog exits cleanly, cooperative  scheduling is maintained and
the embedding C++ code can do whatever it  needs.  From what Kristján tells
me (I don't work on this section of  code myself) it is common that the
scheduler is empty so we use a very large  timeout for the watchdog in order
to detect badly programmed tasklets which  are infinite looping or something
similar.
 
Links of interest:
 
The slideshow:
_http://www.stackless.com/Members/rmtew/code/PyCon2006-StacklessEvePresentatio
n.zip/download_ 
(http://www.stackless.com/Members/rmtew/code/PyCon2006-StacklessEvePresentation.zip/download) 
 
Basic C++ framework with alternate yielding method BeNice:
_http://svn.python.org/view/stackless/sandbox/examples/embedding/watchdog-cpp/
_ 
(http://svn.python.org/view/stackless/sandbox/examples/embedding/watchdog-cpp/) 
 
Basic C framework with alternate yielding method BeNice:
_http://svn.python.org/view/stackless/sandbox/examples/embedding/watchdog-c/_ 
(http://svn.python.org/view/stackless/sandbox/examples/embedding/watchdog-c/) 
 
> 3. go back to the C++ main loop and block on select()  again
>
> This way works but not so elegant. It might be idle and  waste a few hundred
> millisecond per loop in one framework while the  other framework has work
> waiting for it to do.
>
> I am  thinking a "perfect" model will be ...
>
> If stackless internally  is also blocking on a select( fdset2 ) call, we can
> add a stackless API  to export that file descriptor set (fdset2).
> Then we can merge two  select() calls of two main loops into a single 
select(
> fdset1+ fdset2 )  call. We can then listen to all events in one blocking
> select  call.
 
Stackless does not do any calls to select.  All it does is add  tasklets,
channels and scheduling to the Python runtime.  It has no need  to wait
on any file descriptors itself.
 
Hope this helps,
Richard.
 
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.stackless.com/pipermail/stackless/attachments/20061014/4b06a41b/attachment.htm>
-------------- next part --------------
_______________________________________________
Stackless mailing list
Stackless at stackless.com
http://www.stackless.com/mailman/listinfo/stackless


More information about the Stackless mailing list