Pythonでのマイクロスレッド
http://www.gamasutra.com/features/20020821/dawson_pfv.htm
を見て知りましたー。
Pythonだとこんなに簡単にマイクロスレッドが、実装できてしまうんですねー。
…今まで知らなかったのが悔やまれます、、。
ウサギとカメのゲーム
#!/usr/bin/env python # -*- coding: utf-8 -*- # Pytho 2.2だとこの文が必要 from __future__ import generators class Task: """ ゲームタスク """ def __init__(self, name, x, dx): """ コンストラクタ """ self.__genHandle = self.__updateFunction() self.name = name # 名前 self.x = x # 座標 self.dx = dx # 移動量 def update(self): """ 更新関数 """ return self.__genHandle.next() def __updateFunction(self): """ 本当の更新関数 """ while True: yield() # ※ポイント self.x += self.dx def __str__(self): return "%s-->%dm地点"%(self.name, self.x) def main(): """ カメとウサギの競争ゲーム """ tortoise = Task("カメ", 0, 1) # カメ rabbit = Task("ウサギ", 0, 2) # ウサギ timer = 0 GOAL = 10 # ゴール地点 while True: print "%d秒経過..."%timer for task in [tortoise, rabbit]: task.update() print task if task.x > GOAL: print "%sの勝ち!"%task.name return timer += 1 print "" if __name__ == "__main__": main()
実行結果
0秒経過... カメ-->0m地点 ウサギ-->0m地点 1秒経過... カメ-->1m地点 ウサギ-->2m地点 2秒経過... カメ-->2m地点 ウサギ-->4m地点 3秒経過... カメ-->3m地点 ウサギ-->6m地点 4秒経過... カメ-->4m地点 ウサギ-->8m地点 5秒経過... カメ-->5m地点 ウサギ-->10m地点 6秒経過... カメ-->6m地点 ウサギ-->12m地点 ウサギの勝ち!
ポイントは、__updateFunction()の、
yield(self.x) # ※ポイント
です。
「yield」っていうのは、その関数の実行を「一時停止」したまま戻ってくる、という関数です。
ほかにも、マイクロスレッドを使えば、
階層化したスクリプトをそのままベタ読みしてもOKとか、
複雑なAIを実行するときに、描画処理が止めることがないとか、
FSMを考えないで実装できる、とか、、
…おおお、夢が膨らみますね〜♪