gpt4 book ai didi

zeromq - 为什么 LINGER=0 和 SNDTIMEO=0 用于 Zyre Actor 的 PAIR 套接字?

转载 作者:行者123 更新时间:2023-12-01 03:29:27 35 4
gpt4 key购买 nike

查看 Pyre 的(Zyre 的 Python 版本)源代码,我看到了以下内容:

def zcreate_pipe(ctx, hwm=1000):
backend = zsocket.ZSocket(ctx, zmq.PAIR)
frontend = zsocket.ZSocket(ctx, zmq.PAIR)
# ...
# close immediately on shutdown
backend.setsockopt(zmq.LINGER, 0)
frontend.setsockopt(zmq.LINGER, 0)

class ZActor(object):
# ...

def __init__(self, ctx, actor, *args, **kwargs):
# ...
self.pipe, self.shim_pipe = zhelper.zcreate_pipe(ctx)
# ...

def run(self):
self.shim_handler(*self.shim_args, **self.shim_kwargs)
self.shim_pipe.set(zmq.SNDTIMEO, 0)
self.shim_pipe.signal()
self.shim_pipe.close()

def destroy(self):
# ...
self.pipe.set(zmq.SNDTIMEO, 0)
self.pipe.send_unicode("$TERM")
self.pipe.wait()
self.pipe.close()
我感兴趣的是 LINGER=0 的用途和 SNDTIMEO=0 .
相应的文档是 herehere :

ZMQ_SNDTIMEO: Maximum time before a send operation returns with EAGAIN

[rather self-explanatory]

ZMQ_LINGER: Set linger period for socket shutdown

[...] The linger period determines how long pending messages which have yet to be sent to a peer shall linger in memory after a socket is closed with zmq_close(3), and further affects the termination of the socket's context with zmq_term(3). [...]

  • [...]

  • The value of 0 specifies no linger period. Pending messages shall be discarded immediately when the socket is closed with zmq_close().

  • [...]


所以简而言之,可能不会发送两个方向的最后一条消息。如 send会阻塞, SNDTIMEO=0会启动,并且(大概是如果发送队列中还有东西) LINGER=0可能会在 close 期间丢弃消息.
这似乎是个坏主意,因为如果 $TERM被丢弃,actor 不会被杀死,如果 signal被丢弃,调用线程只会阻塞。对我来说唯一有意义的方法是,如果消息可能永远不会被丢弃(因为 PAIR 超过 inproc:// 传输的某些特征?),但是,为什么首先使用套接字选项?
是什么让这段代码按预期工作,为什么以这种方式使用套接字选项,在什么情况下我应该/不应该遵循这个例子?

最佳答案

对我来说,这看起来像是一个潜在的错误(死锁/挂起)。如果 actor 没有足够快地读取发送给它的消息,队列(大小为 'hwm')可能已满 - 这意味着 zmq 不会发送任何内容,并且 destroy() 将最终等待预期的信号 Actor 退出 - 但由于 Actor 从未收到“$TERM”,它无法使用react - 除非它的 recv() 超时,否则它也可能永远等待消息。

[我注意到在 destroy() 方法中的 wait() 之前似乎有一个怀疑的评论 - 所以你可能不是第一个注意到这一点的人 ]

我会小心处理 destroy() - 实际上,您可以编写您的解决方案,以便队列溢出的可能性很小 - 或者您可以检查发送是否在 destroy() 中成功 - 如果没有 - 再试一次(超时) 或跳过wait()。

关于zeromq - 为什么 LINGER=0 和 SNDTIMEO=0 用于 Zyre Actor 的 PAIR 套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38992804/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com