gpt4 book ai didi

python - rpyc.Service 需要 10 秒来接收 150kB 的对象(在本地主机上,没有 LAN 问题)

转载 作者:太空宇宙 更新时间:2023-11-03 11:32:44 25 4
gpt4 key购买 nike

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

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

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

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

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

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

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.')

虚拟.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_))

最佳答案

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

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

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

关于python - rpyc.Service 需要 10 秒来接收 150kB 的对象(在本地主机上,没有 LAN 问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14463643/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com