rpyc.Service需要10秒才能收到150kB对象(在localhost上,没有局域网问题)

时间:2013-01-22 16:44:46

标签: python rpyc

我正在构建一个大的(150kB,当腌制)虚拟字典,并在其上运行一个快速,流畅的虚拟函数。

当通过rpyc.Service公开相同的功能时,即使我的客户端和服务器站在同一主机上,所用的时间也会变为10秒(而不是0.0009秒)(这里没有LAN延迟问题)。 / p>

知道为什么我的150kB对象需要很长时间才能从客户端传送到同一主机上的服务器吗?

为什么函数dummy.dummy()被调用,即使输入对象尚未“可用”(如果是,那么在函数中花费的时间在两个测试用例中是相同的)?

以下是我的python(3.2)代码。我测量了在dummy.dummy(d)中花费的时间。

  1. 案例1:客户调用dummy.dummy;执行时间= 0.0009
  2. 案例2:dummy.dummy被称为rpyc服务;执行时间= 10秒
  3. mini_service.py

    import rpyc
    from rpyc.utils.server import ThreadedServer
    import dummy
    
    class miniService(rpyc.Service):
        def exposed_myfunc(self,d):
            #Test case 2: call dummy.dummy from the service
            dummy.dummy(d)
    
    if __name__=='__main__':
        t = ThreadedServer(miniService,protocol_config = {"allow_public_attrs" : True}, port = 19865)
        t.start()
    

    mini_client.py

    import rpyc
    import sys
    import pickle
    import dummy
    
    def makedict(n):
        d={x:x for x in range(n)}
        return d
    
    if __name__ == "__main__":
        d=makedict(20000)
        print(sys.getsizeof(d))             #result = 393356
    
    #   output = open("C:\\rd\\non_mc_test_files\\mini.pkl",'wb') #117kB object for n=20k
    #   pickle.dump(d,output)
    #   output.close()
    
    #RUN1 : dummy.dummy(d) out of rpyc takes 0.00099 seconds
    #   dummy.dummy(d)
    
    #RUN2 : dummy.dummy(d) via RPYC on localhost takes 9.346 seconds
        conn=rpyc.connect('localhost',19865,config={"allow_pickle":True})
        conn.root.myfunc(d)
    
        print('Done.')  
    

    dummy.py

    import time
    
    def dummy(d):
        start_ = time.time()
        for key in d:
            d[key]=0
        print('Time spent in dummy in seconds: ' + str(time.time()-start_)) 
    

1 个答案:

答案 0 :(得分:2)

看起来性能损失来自rpyc为保持客户端和服务器之间的对象(通过引用传递)保持同步所做的工作。

我现在在我的应用程序中做的是对输入对象进行深度复制,然后处理副本,从而模拟传递值机制。

注意:深度复制需要在协议配置参数中设置allow_picke=True