threading

Dominic nomail at nospam.no
Tue Jun 29 16:51:43 EDT 2004


I would also favour a queue-based
solution.

This is something I have done
some time ago - for fun.
Maybe this old experimental
code snippet helps you somehow ;-)

Ciao,
  Dominic

from __future__ import generators
from thread import start_new
from md5 import md5
from time import sleep
from Queue import Queue

def heavy_task(str):
     print 'start heavy_task'
     sleep(1)
     print 'done'
     return md5(str).hexdigest()

def handle1():
     while 1:
         s = raw_input()
         a = Async(heavy_task)
         yield a(s)
         result = "Result is " + str(a.get_result())
         yield result

def main_loop():
     start_new(do_task,())
     context = handle1()
     while 1:
         async = context.next()
         ready_task.put(async.get_task())
         for i in range(10):
             print i,
             sleep(.5)
         async.set_result(done_task.get())
         print context.next()

#######################################################


ready_task = Queue()
done_task = Queue()

def do_task():
     while 1:
         func, args, kargs = ready_task.get()
         result = func(*args,**kargs)
         done_task.put(result)

class Async(object):
     result = None
     def __init__(self, obj):
         self.obj = obj
         return self
     def __call__(self, *args, **kargs):
         self.args = args
         self.kargs = kargs
         return self
     def get_result(self):
         return self.result
     def get_task(self):
         return (self.obj,self.args,self.kargs)
     def set_result(self, *args):
         self.result = args

main_loop()



More information about the Python-list mailing list