ESX大活躍 PythonのBaseManagerでリモートのCPUをしゃぶり尽そう
そもそも、そんな為にある訳じゃないと思うけど、処理を外だしに出来たら手元のCPUに負荷かけなくて済みそうじゃん!ということで、Python2.6で標準搭載のmultiprocessin.managersを使ってリモートでのプロセスを上手に焼いてみようと思う。焦げそうだけど・・
追記)全然うごかない。以下失敗談
環境
ローカル側
- OSX 10.5.5
- python2.6
- .dmgからインストールしたやつ
- http://www.python.org/ftp/python/2.6/python-2.6-macosx.dmg
リモート側
- ubuntu8.04 on ESXi3.5
- python2.6
- 以下の通りに、インストールした
cd ソースをDLするディレクトリ wget http://python.org/ftp/python/2.6/Python-2.6.tgz cd Python-2.6 sudo aptitude install libc6-dev sudo ./configure make sudo make install
ソース(引用もと:http://docs.python.org/dev/library/multiprocessing.html#using-a-remote-manager)
ローカル側:bm_local.py
from multiprocessing.managers import BaseManager class QueueManager(BaseManager): pass QueueManager.register('getQueue') m = QueueManager.from_address(address=('localhost', 50000),authkey='goma') queue = m.getQueue() queue.put('hello') queue.get()
リモート側:bm_server.py
# coding:utf-8 from multiprocessing.managers import BaseManager import Queue queue = Queue.Queue() class QueueManager(BaseManager):pass QueueManager.register('getQueue', callable=lambda:queue) m = QueueManager(address=('', 50000), authkey='abracadabra') m.serveForever()
結果
撃沈・・・
そもそもリモート側でサーバーが起動しない。実行のさせ方がおかしいのかも知れないが
$ python bm_server.py
とやって起動すると思ってるけど違うのかな?エラーでは
Traceback (most recent call last): File "bm_server.py", line 12, in <module> m.serveForever() AttributeError: 'QueueManager' object has no attribute 'serveForever'
と言われる。ソースを見に行ったけど確かに、BaseManagerには、serveForeverなんてメソッドはドコにもなかった。インスタンスmが持っているメソッド一覧は
['_Client', '_Listener', '_Server', '__class__', '__delattr__', '__dict__', '__doc__', '__enter__', '__exit__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_address', '_authkey', '_create', '_debug_info', '_finalize_manager', '_number_of_objects', '_registry', '_run_server', '_serializer', '_state', 'address', 'connect', 'getQueue', 'get_server', 'join', 'register', 'start']
なので、やっぱり無い。start()とかget_server()とかぽいけど全然動かず。サーバー側が動かないのでクライアントは意味がない。しかし、こちらでも同じくno attributeエラーが出る。エラーは
AttributeError: type object 'QueueManager' has no attribute 'from_address'
こっちもソース見たけど確かにそんなメソッド無い。なんじゃこりゃ?リリースされてるpythonじゃ動かないのかなぁ?
もうすぐ手元に8コアのマシンが20台弱くらい使えるようになるのでこれで分散で計算させれば、かなりの計算力を手に入れることが出来る。と、思っていたのに・・・ 最中限の計算させたい・・
ちょ!!!!何コレ!!
2.7a0のドキュメントだったよ!!
もうね、死にたい