1

我试图通过 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()在客户端完成之前查看功能(例如日志记录)的进度?

4

1 回答 1

0

这是关于 SO 的类似问题,试图达到相同的效果。引用其接受的答案

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

第二个答案显示了一种yield在 XMLRPCServer 中正确实现的方法。Esp,因为您当前的代码给出了错误:xmlrpclib.Fault: <Fault 1: "<type 'exceptions.TypeError'>:cannot marshal <type 'generator'> objects">.

于 2014-05-02T15:36:59.480 回答