2015-10-06 180 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 –

相关问题