私は大きな (漬けたときは 150kB) ダミーの辞書を作成し、その上でダミーの関数を実行しています。
同じ関数が rpyc.Service を介して公開されると、クライアントとサーバーが同じホスト上にある場合でも、所要時間は (0.0009 秒ではなく) 10 秒になります (ここでは LAN 遅延の問題はありません)。
私の 150kB オブジェクトがクライアントから同じホスト上のサーバーに通信されるのになぜそんなに時間がかかるのですか?
dummy.dummy()
また、入力オブジェクトがまだ「使用可能」でない場合でも関数が呼び出されるのはなぜですか (使用可能である場合、関数で費やされる時間は 2 つのテスト ケースで同じになります)。
以下の私のpython(3.2)コードを参照してください。私は、dummy.dummy(d) で費やされた時間を測定します。
- ケース 1: dummy.dummy がクライアントによって呼び出されます。実行時間 = 0.0009
- ケース 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_))