Python 用ZeroMQ实现多线程服务器

Python 用ZeroMQ实现多线程服务器,python,multithreading,zeromq,Python,Multithreading,Zeromq,我有一个场景,其中.net中的客户端需要连接到python服务器,该服务器为每个接受的客户端创建一个线程。 然后,服务器和客户端在它们之间发送和接收数据,直到客户端断开连接并关闭特定的客户端线程 这个场景适合ZeroMQ吗?如果适合,我应该使用什么模式来实现这个场景?(套接字类型等)它是否与ZMQ一起工作取决于您打算如何处理服务器上的套接字和线程。完全不清楚您是打算让服务器线程处理ZMQ通信,还是所有的ZMQ通信都发生在一个线程中,每个进程的另一个线程通信回主线程,以便ZMQ发送回客户端。后一种

我有一个场景,其中.net中的客户端需要连接到python服务器,该服务器为每个接受的客户端创建一个线程。 然后,服务器和客户端在它们之间发送和接收数据,直到客户端断开连接并关闭特定的客户端线程


这个场景适合ZeroMQ吗?如果适合,我应该使用什么模式来实现这个场景?(套接字类型等)

它是否与ZMQ一起工作取决于您打算如何处理服务器上的套接字和线程。完全不清楚您是打算让服务器线程处理ZMQ通信,还是所有的ZMQ通信都发生在一个线程中,每个进程的另一个线程通信回主线程,以便ZMQ发送回客户端。后一种情况是“ZMQ方式”,前者需要更多的箍才能正常工作

如果您希望所有的ZMQ通信都发生在一个线程中,那么您只需要在新客户端连接时跟踪它们,启动一个线程以及与该线程的通信(如果您愿意,可以通过一对单独的ZMQ套接字进行),然后在客户端断开连接时,关闭线程。作为一个架构,这是相当直截了当的

如果您希望让每个线程处理回其客户机的ZMQ通信,那么事情就有点棘手了。服务器上不能有一个套接字可供所有线程使用,每个线程都可以用来同时与客户端通信。ZMQ插槽不是螺纹安全的。它们打算一次由一个线程串行使用,建议不要在线程之间传递它们(但可以通过执行一个完整的内存屏障来实现——如果可能的话,不确定在python中实现这一点需要什么;python GIL可能“免费”完成这一点)-如果你选择依赖这种行为,祝你好运)

实现这一点的方法“ZMQ方式”是在主线程中接受传入连接,使用新套接字启动线程(它可以使用相同的ZMQ上下文,这是线程安全的),向客户端返回绑定新端口的通信,让客户端断开与主套接字的连接,并在新线程中重新连接到套接字。当它断开连接时,让该线程终止。有点混乱,但如果这是你想要的,是可行的


如果这两种方法中的任何一种对您有效,我将使用经销商(客户机)/路由器(服务器)作为您的套接字类型,以支持完全异步通信。为您提供了一些可能的通信模式,以实现各种目标。

每个客户端的线程听起来不太好,特别是如果您考虑到Python模拟线程的功能。你看过ZMQ指南了吗?是的,我看过该指南(至少大部分),我知道线程在zeromq中不是一个好的实践,但我的服务器需要为每个客户机打开一个套接字,连接到具有适当协议和sdk的第三方服务。那么为什么不使用常规套接字呢?在这里使用ZMQ可以实现什么?看起来您不需要ZMQ提供的断开连接的tcp方法。我想这样可以省去编写桥接python/.net字符串和部分消息到达的所有发送/接收逻辑。客户端和服务器之间的通信是同步的还是异步的?如果它是同步的,请尝试使用
REQ
-
REP
套接字对。