2008年2月19日火曜日

SimpleXMLRPCServerはConcurrentじゃない。

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
というだけこと。まあ、答えを返すまでの時間が短く、呼ばれる頻度が低く、ほぼ同時呼ばれるようなことがなければ特に問題はないのですが。

server.py

#!/usr/bin/python

import xmlrpclib
from SimpleXMLRPCServer import SimpleXMLRPCServer
import time
import os
import sys



server = SimpleXMLRPCServer(('localhost', 9000))

def fib(n):
server = xmlrpclib.ServerProxy('http://localhost:9000')
if n == 0:
return 0
elif n == 1:
return 1
return server.fib(n-1) + server.fib(n-2)

server.register_function(fib)
server.serve_forever()

n > 1でcallすると戻ってこない。fibを呼んでいる間にfibを呼び出せないから。
「帰り」のサーバを用意して、戻ってきたらos依存な方法で通知するの?なんだかなぁ・・・。


今思いつく解決策:

- ConcurrentなXMLRPCServerを持ってくるか、もしくは実装する。呼び出し側はその関数でBlockする・・・HTTPがTimeoutしねーか?

- 帰りのサーバを用意してfolkで生じた子プロセスからXMLRPCで呼び出してもらう。帰りのサーバから呼び出しもとのプロセスに通知する必要がある。

signal @ codezine。しかしsignal moduleの中にsignalを発生させる関数が見当たらんが・・・?!?

0 件のコメント: