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を考えないで実装できる、とか、、
…おおお、夢が膨らみますね〜♪