[Date Prev][Date Next][Thread Prev][Thread Next]
- Subject: Re: First timer on cooperative multitasking
- From: Sean Conner <sean@...>
- Date: Sat, 27 Aug 2011 05:13:26 -0400
It was thus said that the Great Thijs Schreijer once stated:
> Hi all,
> I've been using lua for some time as an embedded scripting language. The
> implementation was a pre-emptive multitasking environment. I now have the
> intention to do some lua-only developments and have been looking into the
> cooperative multitasking model.
> The basics are very clear, but there is one part that I feel uncomfortable
> with; How often and when would I have to yield? Are there any guidelines on
I implemented a cooperative scheduler in C/Lua based around a homebrewed
network API. Basically, when ever I read from a socket, I would yield, and
possibly with socket writes as well (for instance, I wanted to write 8k, but
only 1k was accepted, yield until I can write to that socket again). I
didn't bother with trying to ensure arbitrary code would yield properly as I
was the only one writing the code.
The C code was event driven (using epoll() under Linux). The Lua code is
nice---for instance, an echo service:
-- When a TCP connection is accepted, a Lua coroutine is created and
-- a function called "main()" in the script is called. Any calls
-- through the "socket" object can block, causing another Lua
-- "thread" to run.
while true do
The C code ... isn't quite so straight forward.
> In general my understanding is that not yielding for too long, will make
> other threads unresponsive, that's obvious. But I intent do use luasockets
> and maybe some RS232 serial stuff, so that's where my concerns are; loosing
> incoming data on those IO channels because another thread doesn't yield in
It's up to the programmer writing the scripts to properly yield---if you
want to enfore this (and don't trust the programmer), you need preemption,
But, like I said, decent places to call yield() behind the scenes include
places that normally block, like network or serial communication.
> The google mainly returned long debates on preemptive vs cooperative, but no
> info on how to make it work best.
Cooperative multitasking is actually very simple---just yield to another
thread. When to do that, is the not-so-easy part.
-spc (If you like, I can provide what I have, although it's mostly
undocumented ... )