我正在尝试将我的服务器中的spyne(http://spyne.io)与ZeroMQ和MsgPack一起使用。我已经按照示例对服务器端进行了编程,但是找不到任何可以帮助我了解如何对客户端进行编程的示例。
我已经找到了类spyne.client.zeromq.ZeroMQClient,但是我不知道它应该是其构造函数的“app”参数。
先感谢您!
编辑:
(简化的)服务器端代码:
from spyne.application import Application
from spyne.protocol.msgpack import MessagePackRpc
from spyne.server.zeromq import ZeroMQServer
from spyne.service import ServiceBase
from spyne.decorator import srpc
from spyne.model.primitive import Unicode
class RadianteRPC(ServiceBase):
@srpc(_returns=Unicode)
def whoiam():
return "Hello I am Seldon!"
radiante_rpc = Application(
[RadianteRPC],
tns="radiante.rpc",
in_protocol=MessagePackRpc(validator="soft"),
out_protocol=MessagePackRpc()
)
s = ZeroMQServer(radiante_rpc, "tcp://127.0.0.1:5001")
s.serve_forever()
最佳答案
Spyne的作者在这里。
Spyne的客户端传输存在许多问题。
首先也是最重要的一点是,它们需要服务器代码才能工作。这是因为Spyne的wsdl解析器仅完成了一半,因此无法将服务器公开给客户端的接口(interface)进行通信。
一旦Wsdl解析器完成,Spyne的客户端传输也将恢复。尽管测试通过了,但是它们工作得很好,但是(有些)过时了,并且您注意到,没有合适的文档。
现在回到您的问题:客户端构造函数的app参数与服务器构造函数的应用程序实例相同。因此,如果您这样做:
c = ZeroMQClient("tcp://127.0.0.1:5001", radiante_rpc)
print c.service.whoiam()
它将显示“你好,我是塞尔登!”
这是我刚刚提交的完整代码:https://github.com/arskom/spyne/tree/master/examples/zeromq
但:
综上所述,您不应将ZeroMQ用于RPC。
我回想起出于RPC目的的ZeroMQ时,它的炒作达到了疯狂的水平((我甚至在ZeroMQ贡献者列表中都得到了我的名字:))我不喜欢自己所看到的,我继续前进。
在此处粘贴来自https://news.ycombinator.com/item?id=6089252的我相关的news.yc评论:
我似乎已经在一年多以前写了那条评论。时至今日,我在Spyne 2.11中实现并发布了MessagePack传输。因此,如果您正在寻找一种用于内部传递小消息的轻量级传输,我的建议是使用它而不是ZeroMQ。
但是,一旦您离开Http领域,您就回到系统级别的套接字上,这可能是您想要的,也可能不是,这取决于您为此预留的资源量您的项目。
不幸的是,除了我在这里放在一起的示异常(exception),没有关于它的文档:https://github.com/arskom/spyne/tree/master/examples/msgpack_transport
服务器代码是相当标准的Spyne/Twisted代码,但客户端使用系统级套接字来说明其工作方式。我很乐意接受将请求包装到适当的Spyne客户端传输中的请求请求。
我希望这有帮助。欢迎打补丁。
此致,
关于python - 有一个Spyne客户的例子吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25165050/