从python SimpleXMLRPCServer中的远程函数中生成或记录

时间:2014-05-02 14:51:49

标签: python yield simplexmlrpcserver

我试图通过Python中的XMLRPC调用一个很长(耗时)的函数。

我的server.py:

import time
import SocketServer
import SimpleXMLRPCServer

PORT = 19989

class MyXMLRPCServer(SocketServer.ThreadingMixIn, SimpleXMLRPCServer.SimpleXMLRPCServer):
    pass

def hello():
    for x in xrange(10):
        yield "hello {}".format(x)
        time.sleep(1)

if __name__ == "__main__":
    server = MyXMLRPCServer(("", PORT),
                            requestHandler=SimpleXMLRPCServer.SimpleXMLRPCRequestHandler,
                            logRequests=True,
                            allow_none=True)
    server.register_function(hello)
    server.serve_forever()

和我的client.py:

import xmlrpclib

HOST, PORT = "localhost",   19989

if __name__ == "__main__":
    my_server = xmlrpclib.ServerProxy('http://{}:{}'.format(HOST, PORT))
    print my_server.hello()

有没有办法在客户端完成之前查看hello()功能(例如日志记录)的进度?

1 个答案:

答案 0 :(得分:0)

这里是SO的similar question,试图达到同样的效果。引用其accepted answer

  

如果您希望XML-RPC具有长时间运行的早期返回任务,您可能需要将服务器重写为异步框架,例如twisted

2nd answer from that显示了在XMLRPCServer中正确实现yield的方法。 Esp,因为您当前的代码提供错误:xmlrpclib.Fault: <Fault 1: "<type 'exceptions.TypeError'>:cannot marshal <type 'generator'> objects">