[Stackless] Google's new Go programming language
Andrew Dalke
dalke at dalkescientific.com
Sun Nov 15 17:13:24 CET 2009
On Nov 12, 2009, at 9:40 PM, Andrew Francis wrote:
> That said, one feature that would be nice to have in Stackless as a
> language feature would be select, where one is waiting on multiple
> channels. Yes this could be built as library but it is not as nice.
One of the Go demos is
func server(op binOp, service chan *request, quit chan bool) {
for {
select {
case req := <-service:
go run(op, req); // don't wait for it
case <-quit:
return;
}
}
}
Doing this in stackless seems complicated. The solution I see would be
def forward_requests(name, from_ch, to_ch):
for item in from_ch:
to_ch.send( (name, item) )
common_channel = channel()
tasklet(forward_requests)("req", request, common_channel)
tasklet(forward_requsts)("quit", quit, common_channel)
for tag, item in common_channel():
if tag == "quit":
return
elif tag == "req":
tasklet(run)(op, req)
This could be wrapped up in a function like, perhaps,
def select(**kwargs):
common_channel = channel()
for name, from_ch in kwargs.items():
forward_requests(name, from_ch, common_channel)
return common_channel
making the entire process
for (name, event) in select(quit=quit, req=request)
if name == "quit":
return
elif tag == "req":
tasklet(run)(op, req)
Is this clean? Elegant? A hack? I don't recall people bringing up the
need for something like it before.
>
Andrew
dalke at dalkescientific.com
More information about the Stackless
mailing list