2015-10-06 201 views
0

我有問題從Pyro4服務器(版本4.39,serializer = pickle)獲取簡單的numpy陣列,當它的大小超過特定的閾值。服務器處理請求和來回復,但客戶端撐掛Pyro4客戶端沒有收到消息

代碼如下:

服務器代碼:

import numpy as np, Pyro4 

    class U(object): 
     def __init__(self): 
      self.Data = np.arange(10000000).reshape(200,50000) 
      print self.Data.shape 

     def get(self,name): 
      print '%s Requested' % name 
      return self.Data 


    def run(): 
     Uni   = U() 
     daemon  = Pyro4.Daemon(host='localhost') 
     ns   = Pyro4.locateNS() 
     uri   = daemon.register(Uni) 
     ns.register("test",uri) 
     print 'Up and waiting ...' 
     daemon.requestLoop() 

    if __name__ == '__main__': 
     run() 

客戶端代碼:

import Pyro4 
    ns = Pyro4.locateNS() 
    uri = ns.lookup('test') 
    U=Pyro4.Proxy(uri) 
    Data = U.get('Data') 

服務器輸出: ( 200,50000) 正在等待... 需要數據

所以看起來Pyro服務器處理來自客戶端的請求並返回數據,但客戶端永遠不會收到它並且無限期地等待接收消息。

PS: - 爲更小的尺寸陣列相同的代碼工作(200,5000)

沒有任何一個有一個想法可能是什麼問題?

你的幫助是非常讚賞,

+0

另外一個需要運行'蟒蛇-m「Pyro4.naming」'啓動名稱服務器。 – User

+0

對不起,忘記提及 –

回答

0

當我運行它,客戶停止與

Traceback (most recent call last): 
    File "client.py", line 5, in <module> 
    Data = U.get('Data') 
    File "C:\python34\lib\site-packages\Pyro4\core.py", line 171, in __call__ 
    return self.__send(self.__name, args, kwargs) 
    File "C:\python34\lib\site-packages\Pyro4\core.py", line 426, in _pyroInvoke 
    raise data 
TypeError: don't know how to serialize class <class 'numpy.ndarray'>. Give it vars() or an appropriate __getstate__ 
+0

需要更改序列化程序來泡菜以獲得numpy工作... set PYRO_SERIALIZER ='pickle' –

+1

當我執行'set PYRO_SERIALIZER = pickle'時,出現錯誤:'Pyro4.errors.NamingError:Failed找到由'Pyro4.errors.CommunicationError:連接被拒絕導致的名稱服務器,原因:未使用的序列化消息:4'。你能否在你的問題中添加更多細節,以便每個人都可以使用它?另外考慮發送一個鏈接到這個問題的Pyro郵件列表。你也可以得到幫助。 – User

+0

請閱讀Pyro文檔,其中有一整段專門討論這個https://pythonhosted.org/Pyro4/tipstricks.html?highlight=numpy#pyro-and-numpy –

相關問題