Использование сопрограмм в Python или как написать операционную систему в 200 строк кода 11 November 2015 16:04 |
Зарегистрирован: 10 лет назад Сообщений: 74 |
# ------------------------------------------------------------ # pyos3.py - The Python Operating System # # Step 3: Added handling for task termination # ------------------------------------------------------------ from __future__ import absolute_import, division, print_function, unicode_literals # ------------------------------------------------------------ # === Tasks === # ------------------------------------------------------------ class Task(object): taskid = 0 def __init__(self,target): Task.taskid += 1 self.tid = Task.taskid # Task ID self.target = target # Target coroutine self.sendval = None # Value to send # Run a task until it hits the next yield statement def run(self): return self.target.send(self.sendval) # ------------------------------------------------------------ # === Scheduler === # ------------------------------------------------------------ from Queue import Queue class Scheduler(object): def __init__(self): self.ready = Queue() self.taskmap = {} def new(self,target): newtask = Task(target) self.taskmap[newtask.tid] = newtask self.schedule(newtask) return newtask.tid def exit(self,task): print ("Task %d terminated" % task.tid) del self.taskmap[task.tid] def schedule(self,task): self.ready.put(task) def mainloop(self): while self.taskmap: task = self.ready.get() try: result = task.run() except StopIteration: self.exit(task) continue self.schedule(task) # ------------------------------------------------------------ # === Example === # ------------------------------------------------------------ if __name__ == '__main__': def foo(): for i in xrange(10): print ("I'm foo" ) yield def bar(): for i in xrange(5): print ("I'm bar" ) yield sched = Scheduler() sched.new(foo()) sched.new(bar()) sched.mainloop()
[w495@95 coroutines]$ python pyos3.py I'm foo I'm bar I'm foo I'm bar I'm foo I'm bar I'm foo I'm bar I'm foo I'm bar I'm foo Task 2 terminated I'm foo I'm foo I'm foo I'm foo Task 1 terminated [w495@95 coroutines]$