hi, maybe someone could give me a first starting help as I'm new to stackless.
I'm stacked with a worker tasklet - which should interact with an other tasklet running a while loop. I thought something like the NonblockingChannel (http://zope.stackless.com/wiki/ChannelExamples) might be needed but could not get it to work The whole code is at the end ! #### PROBLEM: the while loop should run till we receive something not sure how that is best done. At the moment it blocks always for 30 sec. class testloop def action(self): datacount=0 while 1: print "testloop: ", time.time() #### PROBLEM: the while loop should run till we receive something not sure how that is best done. # A small example would be much appreciated. # At the moment it blocks always for 30 sec. (worker_ch, message) = self.ch.receive() print "testloop: message from: ", message worker_ch.send(datacount) time.sleep(0.1) datacount = datacount + 1 #### CODE START import time import stackless class Sleep(object): def __init__(self): self.sleepingTasklets = [] stackless.tasklet(self.ManageSleepingTasklets)() def Sleep(self, secondsToWait): channel = stackless.channel() endTime = time.time() + secondsToWait self.sleepingTasklets.append((endTime, channel)) self.sleepingTasklets.sort() # Block until we get sent an awakening notification. channel.receive() def ManageSleepingTasklets(self): while True: if len(self.sleepingTasklets): endTime = self.sleepingTasklets[0][0] if endTime <= time.time(): channel = self.sleepingTasklets[0][1] del self.sleepingTasklets[0] # We have to send something, but it doesn't matter what as it is not used. channel.send(None) elif stackless.getruncount() == 1: # We are the only tasklet running, the rest are blocked on channels sleeping. # We can call time.sleep until the first awakens to avoid a busy wait. delay = endTime - time.time() #print "wait delay", delay time.sleep(max(delay,0)) stackless.schedule() sleep = Sleep().Sleep # based on http://code.google.com/p/stacklessexamples/source/browse/trunk/#trunk/examples/santaAgentsOO.py class testloop(object): """ testloop should run most of the time only to be shortly interrupted by a worker to exchange some data """ def __init__(self): self.ch = stackless.channel() self.running = True stackless.tasklet(self.runAction)() def runAction(self): while self.running: self.action() def action(self): datacount=0 while 1: print "testloop: ", time.time() #### PROBLEM: the while loop should run till we receive something not sure how that is best done. # A small example would be much appreciated. # At the moment it blocks always for 30 sec. (worker_ch, message) = self.ch.receive() print "testloop: message from: ", message worker_ch.send(datacount) time.sleep(0.1) datacount = datacount + 1 class worker(object): def __init__(self, testloop, message, sleeptime): self.testloop = testloop self.message = message self.sleeptime=sleeptime self.ch = stackless.channel() self.running = True stackless.tasklet(self.runAction)() def runAction(self): while self.running: self.action() def action(self): sleep(self.sleeptime) self.testloop.ch.send((self.ch, self.message)) testloop_response = self.ch.receive() stackless.schedule() if __name__ == '__main__': testloop = testloop() worker(testloop, "worker30", 30) worker(testloop, "worker60", 60) stackless.run() #### CODE END Cheers Peter _______________________________________________ Stackless mailing list [email protected] http://www.stackless.com/mailman/listinfo/stackless
