Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 适用于进程通信的Zmq消息模式_Python_Ipc_Zeromq_Pyzmq - Fatal编程技术网

Python 适用于进程通信的Zmq消息模式

Python 适用于进程通信的Zmq消息模式,python,ipc,zeromq,pyzmq,Python,Ipc,Zeromq,Pyzmq,我正在使用pyzmq库在同一台机器上的两个python进程之间建立通信。查看ZMQ提供的可用消息传递模式,不清楚哪种模式适合。在我的情况下,两个进程都需要在一些随机时间相互独立地发送消息。基本上,在不同的时刻,每个进程既是客户机又是服务器。下面是一些视觉描述。 为了实现这个模式,我使用了两个ZMQ.PAIR套接字。每个进程.bind()-s一个套接字在其上接收,并.connect()-s在需要时连接到另一个进程.send()。同样,每个进程都有一个专用线程来处理接收,这是阻塞的 然而,这个设计

我正在使用
pyzmq
库在同一台机器上的两个python进程之间建立通信。查看ZMQ提供的可用消息传递模式,不清楚哪种模式适合。
在我的情况下,两个进程都需要在一些随机时间相互独立地发送消息。基本上,在不同的时刻,每个进程既是客户机又是服务器。下面是一些视觉描述。

为了实现这个模式,我使用了两个
ZMQ.PAIR
套接字。每个进程
.bind()
-s一个套接字在其上接收,并
.connect()-s在需要时连接到另一个进程
.send()

同样,每个进程都有一个专用线程来处理接收,这是阻塞的

然而,这个设计在我看来有点像一个延伸,我想知道是否有一个设置更自然,更适合这种情况?我也在想象这一定很普遍。
在当前的设计中,我也不喜欢这样一个事实,即当进程结束时,我需要手动清理两个套接字。

如果节点完全相同(至少,就通信目的而言,它们如何看待彼此而言,也就是说,没有真正的“可靠”服务器与其他“临时”客户端)那么您有两个选择:

(A)启动两对套接字,一对将一个节点视为服务器,另一对视为客户机,另一对颠倒这种关系。

如果通信遵循节点之间的严格模式,例如,一个节点发起通信,并且在该特定对话结束之前存在特定的来回,则这可能是合适的。这允许每个节点独立地发起通信,并保持自己的通信节奏,而不会将其与另一节点发起的“串扰”混淆

如果某一天可能有两个以上的节点,这也更适合创建星形拓扑,其中每个节点都可以直接与其他节点通信。这可以合理使用的节点数量有一个限制,超过这个限制,您将需要实现某种中央代理

(B)只需选择一个节点作为“服务器”,另一个节点作为“客户端”
bind()


这听起来很像你要找的。您不必过分关注哪一方
bind()
s和哪一方
connect()
s。目前,听起来好像每次需要交流时都在打开和关闭连接。你应该考虑只为你的进程的生命开放连接。您使用的
套接字支持完全非结构化的通信,因此无论您指定哪一方为“服务器”,哪一方为“客户机”,您都可以自由地从任意方向发送和接收数据。

在A)情况下,很明显每个进程都涉及两个套接字。对于B)情况,我不清楚您是指每个进程一个还是两个插座。一个套接字意味着当一个线程在套接字上等待接收时,另一个线程将尝试写入。如果可能的话,我更喜欢这个选项,因为它更易于管理,但是以这种方式使用zmq套接字是安全的吗?zmq套接字不是线程安全的,所以您不应该在多个线程之间共享单个套接字(除非在某些有限的条件下,如果您知道自己在做什么,请参阅)。所以,不,这不安全。您需要使用阻塞接收吗?有不阻塞的选项。如果您正在阻止接收套接字,那么该套接字只需专用于接收,您将需要另一个套接字用于发送,除非我对您的体系结构产生了严重误解。我想我需要阻止。我无法预测其他进程何时会发送内容。除非我可以注册一些用于接收/处理内容的回调。我建议您更多地阅读python中的常见设置-通常通信是在一个循环中处理的,该循环允许您在每个滴答声中进行非阻塞接收尝试。您将在示例中经常看到这样的循环,尽管示例中的任何附加工作都是微不足道的。就我所见,在阻塞上下文中使用ZMQ是不常见的。