2014-05-02 24 views
0

我想通過Python中的XMLRPC調用一個很長的(耗時的)函數。從Python中的遠程函數產生或日誌SimpleXMLRPCServer

我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()功能的客戶端上的進展(如日誌記錄)它完成了嗎?

回答

0

這是SO上的similar question,試圖達到同樣的效果。引用其accepted answer

If you want XML-RPC with long-running, early returning tasks, you probably need to rewrite your server into an asynchronous framework, like twisted

2nd answer from that顯示了一種方法來在XMLRPCServer正確地實現yield。因爲你現在的代碼給出了錯誤:Esp,xmlrpclib.Fault: <Fault 1: "<type 'exceptions.TypeError'>:cannot marshal <type 'generator'> objects">

+0

重寫'do_POST'方法給出錯誤''str'對象在服務器上沒有屬性'next''和'xmlrpclib.ProtocolError:'on客戶。另外,我發佈了一個單獨的問題,因爲如果我正確理解類似的問題,作者希望在運行該函數之前產生一個字符串。我想在函數運行時產生一個不確定數量的字符串。 – user1156980

+0

'yeild'將你的功能變成一個發電機。所以你需要一個函數來迭代'hello'返回的函數。您還需要類似地重構您的客戶端和服務器代碼。注意'while(1):server.handle_request()'而不是'server.serve_forever()'的使用。 – aneroid