|
Использование сопрограмм в Python или как написать операционную систему в 200 строк кода 11 November 2015 16:04 |
Зарегистрирован: 12 лет назад Сообщений: 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]$