懒海盗模式与真实请求d

2024-06-11 12:32:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用PyZMQ绑定来学习zmq,我对懒惰海盗模式有问题。 这里是Lazy Pirate server和{a2}的代码。在

在示例中,客户端发送请求,但它是简单的数字。如何使用文本数据发出真正的请求并保持模式实现?在

另外,我并不真正理解客户端代码中的sequence变量-它正在无限递增=>当sequence达到int变量最大值时,python不会崩溃吗?在


Tags: 数据代码文本a2客户端示例server模式
2条回答

首先,代码中的sequence变量基本上是一个消息标识符。单次请求尝试失败有两种方式:

  1. 请求消息根本无法发送
  2. 请求消息发送,但是客户端厌倦了等待,在响应返回之前超时

在第二种情况下,如果您没有sequence号码,您就不知道哪个请求实际上是成功的。在

考虑以下客户历史记录:

  • 发送请求#1
  • 超时
  • 发送请求#2
  • 超时
  • 发送请求#3
  • 接收响应

哪个请求触发了响应?它可以是三个请求中的任何一个,因为上面提到的第二种请求失败。通过响应中的sequence编号,我们可以确切地知道服务器处理的是哪个请求。在

示例客户机中“来自服务器的错误回复”背后的想法是,如果客户机在请求#3(在请求#1和#2时超时),它会丢弃响应#n(其中n<;3),直到到达响应3,它接受。在

若要发送多于序列号的,请使用序列化格式并发送整个对象。在

例如,我可以定义class MyRequest { int sequence; string text; },然后将其作为JSON发送到服务器。在

无限递增的sequence变量可以替换为int64,然后就可以了,或者您可以做一些事情,比如使用GUID作为标识的请求。在

不幸的是,蒂莫西希尔兹的回答是100%不正确的。你可以在这个free for download version of his book代码连接卷1中阅读Hintjen的评论。重要的一点来自141页,如下。。。在

The client sequences each message and checks that replies come back exactly in order: that no requests or replies are lost, and no replies come back more than once, or out of order. Run the test a few times until you’re convinced that this mechanism actually works. You don’t need sequence numbers in a production application; they just help us trust our design.

关于裸TCP可能失败的有趣讨论,这里是a good discussion。阅读评论。我毫不怀疑蒂姆是个很有学问的人,他只是犯了一个错误,没有意识到懒惰的海盗模式尤其是只有使用REQ-REP,因此比他的评论所暗示的更可靠。在

相关问题 更多 >