When it’s ready.

出来るまで出来ない

ESX大活躍 PythonのBaseManagerでリモートのCPUをしゃぶり尽そう

そもそも、そんな為にある訳じゃないと思うけど、処理を外だしに出来たら手元のCPUに負荷かけなくて済みそうじゃん!ということで、Python2.6で標準搭載のmultiprocessin.managersを使ってリモートでのプロセスを上手に焼いてみようと思う。焦げそうだけど・・
追記)全然うごかない。以下失敗談

環境

ローカル側
リモート側
  • 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のドキュメントだったよ!!
もうね、死にたい