Pythonのmultiprocessingで遊んでた流れから、こんどはFlashで分散処理をしてみたくなりました。
DBにオセロの末端から5手前ぐらいの局面を鬼のように登録して行って、Flashでそのタスクを取得、計算して、結果をDBに登録。さらに結果をバッチかなにかで集計して局面の評価値を決めて行くという感じです。
Flashを表示した人のCPUパワーを勝手に借りて行う分散処理。画期的じゃないですか。
まあでも実際やったら勝手にCPU借りるのはおこられそうなので、なにかユーザの興味を引くコンテンツを表示しつつ、裏では計算させてもらいますと、そんな感じでやれば角も立たないんじゃないかなと考えてます。
ただいま実装中。
2009年1月14日水曜日
2009年1月7日水曜日
[Python]multiprocessingを使ったオセロ
Pythonのmultiprocessingを使ってオセロの分散並列処理をやってみました。
サーバのキューに登録されるタスクをクライアントが黙々と計算して結果を返します。
構成はこんな感じです。
使い方は
あとはプロンプトが出てくるので、自分の色を選んで、手を入力して行くと、タスクがクライアントに配布されて探索されます。
クライアントはいくつでも接続できますが、タスク自体が現局面での合法手分しか作られないので、7〜8クライアントぐらいで速度が頭打ちになると思います。
ちょこっと解説。
server.py
タスク配布用と結果受け取り用のキューを作成して、サーバをたてます。
remoteからはサーバに接続した後get_task_queue,get_result_queueでキューを取得できます。
game.py(一部抜粋)
こちらはサーバに接続して、キューを取得しています。
分散並列処理のきもはここだけです。なんて簡単!
あとはタスクをキューに入れて、client側で取って探索するだけ。
client側の接続処理もこの処理と同じです。
サーバのキューに登録されるタスクをクライアントが黙々と計算して結果を返します。
構成はこんな感じです。
server.pyタスク配布用と結果受け取り用のキューを持っているサーバ。Othello.pyオセロの探索を行うクラス。game.pyOthelloのサブクラス。オセロの探索対象の局面をサーバのキューに登録するクラス。client.pyOthelloのサブクラス。キューに入ったタスクを探索して、評価値を返すクラス。game_launcher.pyユーザからの入力を受け取ってgameに初期条件等を与える。
使い方は
- サーバでserver.pyを立ち上げる
- クライアントでclient.pyを立ち上げる
- クライアントorサーバでgame_launcher.pyを立ち上げる
あとはプロンプトが出てくるので、自分の色を選んで、手を入力して行くと、タスクがクライアントに配布されて探索されます。
クライアントはいくつでも接続できますが、タスク自体が現局面での合法手分しか作られないので、7〜8クライアントぐらいで速度が頭打ちになると思います。
ちょこっと解説。
server.py
task_queue = Queue.Queue()
result_queue = Queue.Queue()
class QueueManager(BaseManager): pass
QueueManager.register('get_task_queue',callable=lambda:task_queue)
QueueManager.register('get_result_queue',callable=lambda:result_queue)
m = QueueManager(address=('',8001),authkey='abc')
s = m.get_server()
s.serve_forever()
タスク配布用と結果受け取り用のキューを作成して、サーバをたてます。
remoteからはサーバに接続した後get_task_queue,get_result_queueでキューを取得できます。
game.py(一部抜粋)
class Game(Othello):
def __init__(self,color):
Othello.__init__(self,color)
QueueManager.register('get_task_queue')
QueueManager.register('get_result_queue')
m = QueueManager(address=('example.com',8001),authkey='abc')
m.connect()
self.task_queue = m.get_task_queue()
self.result_queue = m.get_result_queue()
こちらはサーバに接続して、キューを取得しています。
分散並列処理のきもはここだけです。なんて簡単!
あとはタスクをキューに入れて、client側で取って探索するだけ。
client側の接続処理もこの処理と同じです。
2009年1月6日火曜日
[python]multiprocessingで分散並列処理
pythonのmultiprocessingを使って、以前作ったオセロを分散並列処理するように改造してます。
さあ一通りできたしブログにのせるかあ。と思って、ソースを見直していたら、いろいろバグ発見。
直してるうちに、壮大なリファクタリングになってしまって納まりがつかなくなってしまいました。
もうちょっとリファクタリングとバグ修正したら公開する予定。
さあ一通りできたしブログにのせるかあ。と思って、ソースを見直していたら、いろいろバグ発見。
直してるうちに、壮大なリファクタリングになってしまって納まりがつかなくなってしまいました。
もうちょっとリファクタリングとバグ修正したら公開する予定。
2009年1月5日月曜日
技術系の話はこちらで
こーたです。
最近ブログを書いていて、将棋系の話と技術系の話を両方読んでる人は居ないんじゃないかと思ったので、
ブログを二つに分けました。
将棋系の話はこーた日記の方で、技術系の話はこちらで書いて行こうと思います。
最近ブログを書いていて、将棋系の話と技術系の話を両方読んでる人は居ないんじゃないかと思ったので、
ブログを二つに分けました。
将棋系の話はこーた日記の方で、技術系の話はこちらで書いて行こうと思います。
登録:
投稿 (Atom)