Doge log

Abby CTO 雑賀 力王のオフィシャルサイトです

RemoteManagerの件

http://d.hatena.ne.jp/a2c/20081008/1223403985
multiprocessing部はPEP8になってない部分が多かったり、ドキュメントが適当だったりする。
(python2.6で増えた部分は割りと適当なのかも。kqueueんところも最初すげー適当だったし)

bm_server.py
from multiprocessing.managers import BaseManager
import Queue

queue = Queue.Queue()
class QueueManager(BaseManager):
    pass

def _call():
    print("server call")
    return queue

QueueManager.register('getQueue', callable=_call)
m = QueueManager(address=('', 50000), authkey='test')
m.get_server().serve_forever()

受けはServerクラスが受け持つ。
serve_foreverで起動。

manager.py
 144     def serve_forever(self):
 145         '''
 146         Run the server forever
 147         '''
 148         current_process()._manager_server = self
 149         try:
 150             try:
 151                 while 1:
 152                     try:
 153                         c = self.listener.accept()
 154                     except (OSError, IOError):
 155                         continue
 156                     t = threading.Thread(target=self.handle_request, args=(c,))
 157                     t.daemon = True
 158                     t.start()
 159             except (KeyboardInterrupt, SystemExit):
 160                 pass
 161         finally:
 162             self.stop = 999
 163             self.listener.close()

accept毎にスレッドを起こしてるのでどうかな?と思う・・・・。

bm_client.py
from multiprocessing.managers import BaseManager

class QueueManager(BaseManager):
       pass

QueueManager.register('getQueue')
m = QueueManager(address=('localhost', 50000),authkey='test')
m.connect()
queue = m.getQueue()
queue.put('hello')
print(queue.get())

connectで接続するはず。
(ドキュメントに出てないんじゃね?)
内部でClientって奴を作ってるところから勝手にconnectでいいはずという想像だが。
(一応動いてる)
分散ならparallel pythonを使ったほうがいいと思うな。