Добро пожаловать! Войти Зарегистрироваться

Расширенный

Использование сопрограмм в Python или как написать операционную систему в 200 строк кода

Написал w-495 
http://www.dabeaz.com/coroutines/


Пример: https://github.com/srathbun/python-scripts/blob/master/coroutines/pyos3.py
# ------------------------------------------------------------
# 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]$



Исправлений: 1. Последний раз редактировал w-495 в 11.11.2015, 16:04.
Вложения:
открыть | скачать - coroutines.zip (406.2 KB)
открыть | скачать - Coroutines.pdf (424.8 KB)
К сожалению, только зарегистрированные пользователи могут писать в этом форуме.

Авторизоваться на форуме