繁体   English   中英

用ZeroMQ实现多线程服务器

[英]implementing multi-threaded server with ZeroMQ

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

此方案是否适合ZeroMQ,如果适合,我应使用什么模式实施此方案? (插座类型等)

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

如果您希望所有ZMQ通信都在单个线程中进行,则只需跟踪新客户端的连接情况,启动一个线程以及与该线程的通信(如果您在一对单独的ZMQ套接字上进行通信, ),然后随着客户端断开连接,降低线程速度。 相当直接地作为一种体系结构。

如果您希望每个线程都将ZMQ通信处理回其客户端,那么事情会有些麻烦。 不能在服务器上的一个插槽可用于所有线程,每个使用同时通信回到它的客户端。 ZMQ套接字不是线程安全的。 它们打算一次由一个线程连续使用,建议不要在线程之间传递它们(但是可以通过执行完整的内存屏障来完成-不确定是否可以在python中完成此操作;在此建议 Python GIL 可以 “免费”完成此操作-如果您选择依靠这种行为,祝您好运)。

执行“ ZMQ方式”的方法是在主线程中接受传入的连接,使用新的套接字启动线程(它可以使用相同的ZMQ上下文,这线程安全的),并与客户端进行通信绑定了新端口,使客户端与主套接字断开连接,然后重新连接至新线程中的套接字。 当它断开连接时,使该线程终止。 有点麻烦,但是如果那是您想要的,那还是可行的。

如果这两种方法都对您有用,我将使用DEALER(client)/ ROUTER(server)作为您的套接字类型来支持完全异步通信。 该指南的第4章为您针对各种目标提供了一些可能的交流模式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM