在Python SimpleXMLRPCServer中从远程函数返回yield或log

1 投票
1 回答
1005 浏览
提问于 2025-04-18 05:08

我正在尝试通过XMLRPC在Python中调用一个耗时很长的函数。

这是我的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

这里有一个在StackOverflow上提到的类似问题,它试图实现相同的效果。引用它的被接受的答案

如果你想要使用XML-RPC来处理那些需要长时间运行并且能提前返回的任务,你可能需要把你的服务器改写成一个异步框架,比如twisted

来自那个问题的第二个答案展示了一种在XMLRPCServer中正确使用yield的方法。尤其是因为你当前的代码出现了这个错误:xmlrpclib.Fault: <Fault 1: "<type 'exceptions.TypeError'>:cannot marshal <type 'generator'> objects">

撰写回答