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を使ったほうがいいと思うな。