I poked around in Eventlet this morning – between shopping runs and helping Karen move things around in the basement. I’d hoped to knock out a quick hackysack experiment with that stuff – since it sounded about the same – and see how it did. I over-estimated by ability to quickly grok Eventlet, and it’s underpinnings of greenlet as well.
What I’ve finally concluded is that the Eventlet stuff is a nice socket-based processing engine (read web server thingy) using the greenlets – but way more than I’d need for the basics to pull together the hackysack example. Seems like heading straight down to the greenlets themselves is what I’d want to do to make it – only I’m not fully understanding all the pieces and parts to make the hackysack example. I was thinking that Eventlet would have the higher level API’s that made it similiar to a Stackless Tasklet or a Kamaelia Component. Alas, it doesn’t appear so… or I’m just too dense to clue it in anyway.
Anyway, I’ve poked around this morning, realized I’m a bit lost – and so I’m going to give it a break to see if my rear-brain can catch up with some of the core concepts here.
Oh – here’s the code that doesn’t work as yet:
import greenlet import Queue import sys import random class hackeysacker: counter = 0 def __init__(self,name,circle): self.name = name self.circle = circle circle.append(self) self.messageQueue = Queue.Queue() self.g = greenlet(self.goLoop()) def incrementCounter(self): hackeysacker.counter+=1 def goLoop(self): while 1: msg = self.messageQueue.get() if msg == 'exit': return print "%s got hackeysack from %s" % (self.name,msg.name) kickTo = self.circle[random.randint(0,len(self.circle)-1)] while kickTo is self: kickTo = self.circle[random.randint(0,len(self.circle)-1)] print "%s kicking hackeysack to %s" % (self.name, kickTo.name) kickTo.switch(self) hackeysackers = 5 turns = 1 def runit(hs=5,ts=5): global hacksackers,turns hackeysackers = hs turns = ts hackeysacker.counter = 0 circle= one = hackeysacker('1',circle) for i in range(hackeysackers): hackeysacker(`i`,circle) one.g.switch(one) if __name__ == '__main__': runit()