3

xmlrpc サーバーで簡単な例を実行し、キーボードで Ctrl-C を押します :)。

from SimpleXMLRPCServer import SimpleXMLRPCServer
from time import sleep
インポート スレッド、時間

クラス Test(threading.Thread):
    def __init__(自己):
        threading.Thread.__init__(self)
        self.test1 = 0
    デフテスト(自己):
        self.test1 を返す

    デフォルト実行 (自己):
        ながら (1):
            時間.スリープ(1)
            self.test1 = self.test1 + 1

ts = テスト()
ts.start()
サーバー = SimpleXMLRPCServer(("localhost",8888))
server.register_instance(ts)
server.serve_forever()

キーボードを押した後のエラー:

  ファイル "/usr/lib/python2.7/SocketServer.py"、225 行目、serve_forever 内
    r, w, e = select.select([self], [], [], poll_interval)
キーボード割り込み

クライアント

 
xmlrpclib インポート ServerProxy から
r=ServerProxy("http://localhost:8888")
r.test() を出力
 
エラーまたは警告なしで接続を待機しています。この場合、接続を切断する方法は? たぶん、この例は正しくありませんか?

4

2 に答える 2

2

タイムアウトを使用します。

xmlrpclib.ServerProxyのタイムアウトを設定します

編集

ここにリンクされている答えはPython2.7と互換性がありません。動作する変更されたコードは次のとおりです(W7 / ActivePython 2.7でテスト済み):

import xmlrpclib
import httplib

class TimeoutHTTPConnection(httplib.HTTPConnection):

    def __init__(self,host,timeout=10):
        httplib.HTTPConnection.__init__(self,host,timeout=timeout)
        self.set_debuglevel(99)
        #self.sock.settimeout(timeout)

"""
class TimeoutHTTP(httplib.HTTP):
    _connection_class = TimeoutHTTPConnection
    def set_timeout(self, timeout):
        self._conn.timeout = timeout
"""

class TimeoutTransport(xmlrpclib.Transport):
    def __init__(self, timeout=10, *l, **kw):
        xmlrpclib.Transport.__init__(self,*l,**kw)
        self.timeout=timeout

    def make_connection(self, host):
        conn = TimeoutHTTPConnection(host,self.timeout)
        return conn

class TimeoutServerProxy(xmlrpclib.ServerProxy):
    def __init__(self,uri,timeout=10,*l,**kw):
        kw['transport']=TimeoutTransport(timeout=timeout, use_datetime=kw.get('use_datetime',0))
        xmlrpclib.ServerProxy.__init__(self,uri,*l,**kw)

if __name__ == "__main__":
    s=TimeoutServerProxy('http://127.0.0.1:8888',timeout=2)
    print s.test()
于 2011-04-14T15:13:00.003 に答える
0

Testメインスレッドが終了したときに終了するように、インスタンスをデーモン化します。

ts = Test()
ts.setDaemon(True)
ts.start()

問題は、スレッドを XML-RPC ハンドラーとして登録する必要がある理由です。

于 2011-04-14T15:27:34.480 に答える