Hi all. I found cooperative multi-threading(only one thread runs at once, explicit thread switching) is useful for writing some simulators. With it, I'm able to be free from annoying mutual exclusion, and make results deterministic.
For this purpose, and inspired by Ruby(1.9) fiber, I wrote my own version of fiber in Python. It just works, but using native Python threads for non-preemptive threading is not cost-effective. Python has generator instead but it seemed to be very restricted for general scripting. I wish I could write nested (generator) functions easily at least. Is there any plan of implementing real (lightweight) fiber in Python? ------------------------------------------------------------ import threading class Fiber(threading.Thread): def __init__(self): threading.Thread.__init__(self) self.semaphore_running = threading.Semaphore(0) self.semaphore_finish = None self.val = None self.setDaemon(True) self.start() self.start = self.start_fiber def start_fiber(self): self.semaphore_finish = threading.Semaphore(0) self.semaphore_running.release() self.semaphore_finish.acquire() def run(self): # override self.semaphore_running.acquire() self.main() if self.semaphore_finish is not None: self.semaphore_finish.release() def switchto(self, fiber, val=None): fiber.val = val fiber.semaphore_running.release() self.semaphore_running.acquire() return self.val def main(self): # should be overridden pass class F1(Fiber): def main(self): print "f1 start" self.switchto(f2) print "f1 foo" v = self.switchto(f2) print "f1 v=%s world" % v self.switchto(f2, "OK") print "f1 end" class F2(Fiber): def main(self): print "f2 start" self.switchto(f1) print "f2 bar" result = self.switchto(f1, "Hello, ") print "f2 result=%s" % result print "f2 end" self.switchto(f1) f1 = F1() f2 = F2() print "start" f1.start() print "end" -- kayama -- http://mail.python.org/mailman/listinfo/python-list