2

我正在尝试使用 Pyro4 在服务器上运行一个函数。看一下代码:===========================客户端================ ======

import Pyro4
def square(x): 
    return x**2
remoteServer = Pyro4.Proxy('PYRONAME:server')
print(remoteServer.evaluate(square, 4))

============================服务器====================== ====

import Pyro4
class Server(object):
    def evaluate(self, func, args):
        return func(*args)

def main():
    server = Server()
    Pyro4.Daemon.serveSimple({server: "server"},ns=True)

if __name__ == '__main__':
    main()

=========================命名服务器========================

import Pyro4
Pyro4.naming.startNSloop()

==================================================== =========

并得到一个错误:“ Pyro4.errors.ConnectionClosedError:接收:没有足够的数据”。查看下面的完整堆栈跟踪:

    Traceback (most recent call last):
  File "C:\Users\Alex\Desktop\2.py", line 9, in <module>
    print(remoteServer.evaluate(square, 4))
  File "C:\Users\Alex\AppData\Roaming\Python\Python34\site-packages\Pyro4\core.py", line 169, in __call__
    return self.__send(self.__name, args, kwargs)
  File "C:\Users\Alex\AppData\Roaming\Python\Python34\site-packages\Pyro4\core.py", line 380, in _pyroInvoke
    msg = message.Message.recv(self._pyroConnection, [message.MSG_RESULT], hmac_key=self._pyroHmacKey)
  File "C:\Users\Alex\AppData\Roaming\Python\Python34\site-packages\Pyro4\message.py", line 161, in recv
    msg = cls.from_header(connection.recv(cls.header_size))
  File "C:\Users\Alex\AppData\Roaming\Python\Python34\site-packages\Pyro4\socketutil.py", line 460, in recv
    return receiveData(self.sock, size)
  File "C:\Users\Alex\AppData\Roaming\Python\Python34\site-packages\Pyro4\socketutil.py", line 195, in receiveData
    raise err
Pyro4.errors.ConnectionClosedError: receiving: not enough data

我希望服务器执行传递给方法(函数)的函数。

PS:Windows7,Python 3.4.1

我发现了类似的问题(How to send a function to a remote Pyro object),但对我不起作用。尝试使用回调装饰器@pyro4.callback,但即使是官方示例(https://github.com/delmic/Pyro4/tree/master/examples/callback:server2.py,client2.py )也不起作用(使用python 3.4 和 python 2.7) => 仅显示消息:“服务器:对客户端执行回调 1”,但没有任何反应。


谢谢

4

1 回答 1

1

您链接到的 github 存储库不是官方的。这是一个克隆(来自相当旧的版本)。这是官方回购:https ://github.com/irmen/Pyro4

至于您的问题:无法序列化函数并通过网络发送它们。如果你告诉 Pyro 使用 pickle 作为序列化协议,你可以做更多的技巧,但 pickle 仍然需要在连接的两端都有模块源或字节码。

您的客户端崩溃的原因是服务器由于 Pyro 协议错误而中止连接。如果启用日志记录,它将显示在服务器的日志文件中,例如:“Pyro4.errors.ProtocolError: unsupported serialized class: builtins.function”。

还有一个提示:您不必使用单独的源代码文件启动名称服务器。您可以直接从命令行启动它。

最后,@pyro4.callback 装饰器是不相关的,请阅读http://pythonhosted.org/Pyro4/clientcode.html?highlight=callback#pyro-callbacks了解它的用途。它影响 Pyro 处理异常的方式,仅此而已。

编辑:请注意,自 Pyro 4.35 以来,此错误将正确报告回客户端,并且不再会中止连接。

于 2015-02-14T18:36:50.827 回答