Taskletのサンプル

Stackless PythonのTasklet実行のサンプルコード。

# -*- coding: utf-8 -*-
import stackless


def task_setup1(name):
    """何らかのセットアップをする関数1
    """
    print("task - %s - prologue" % name)
    for n in range(2):
        print("task - %s - step(%d)" % (name, n))
        # 任意のタイミングで自分の処理を一時停止して他のタスクに切り替える
        stackless.schedule()
    print("task - %s - epilogue" % name)


def task_setup2(name):
    """何らかのセットアップをする関数2
    """
    print("task - %s - prologue" % name)
    for n in range(3):
        print("task - %s - step(%d)" % (name, n))
        # 任意のタイミングで自分の処理を一時停止して他のタスクに切り替える
        stackless.schedule()
    print("task - %s - epilogue" % name)


def main():

    # 処理すべきタスクを必要なだけ登録
    task1 = stackless.tasklet(task_setup1)
    task1.setup("task1")
    task2 = stackless.tasklet(task_setup2)
    task2.setup("task2")

    # メイン側では何か処理をしつつタスクの終了を待つ
    while any([task1.alive, task2.alive]):
        print("main ----------")
        # タスクを1ステップ呼び出し
        stackless.schedule()
        print("")

    # タスク終了後は次の処理へ
    print("tasklet - complete")


if __name__ == "__main__":
    main()

実行結果

taskletは、登録した順番に呼び出されて処理される。

実行するTaskは常に一つとなる為、同期オブジェクトは不要となります。

main ----------
task - task1 - prologue
task - task1 - step(0)
task - task2 - prologue
task - task2 - step(0)

main ----------
task - task1 - step(1)
task - task2 - step(1)

main ----------
task - task1 - epilogue
task - task2 - step(2)

main ----------
task - task2 - epilogue

tasklet - complete

こういった処理は、microthread, Fiber, coroutineといった名称で呼ばれます。(Stackless Pythonではtaskletです)