4

我正在构建一个大的(腌制时为 150kB)虚拟字典并在其上运行一个快速平稳运行的虚拟函数。

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

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

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

参见下面的我的 python (3.2) 代码。我测量在 dummy.dummy(d) 中花费的时间。

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

迷你服务.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()

迷你客户端.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.')  

假人.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_)) 
4

1 回答 1

2

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

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

注意:深拷贝需要allow_picke=True在协议配置参数中进行设置。

于 2013-01-23T09:20:14.107 回答