我有一个场景,我在.net中有客户端需要连接到python服务器,为每个接受的客户端创建一个线程。 然后,服务器和客户端在它们之间发送和接收数据,直到客户端断开连接并关闭特定的客户端线程。
此方案是否适合ZeroMQ,如果是,我应该使用哪些模式来实现此方案? (套接字类型等)
答案 0 :(得分:1)
是否与ZMQ一起使用取决于您打算如何处理服务器上的套接字和线程。它是否完全不清楚您是否打算服务器线程处理ZMQ通信,或者是否所有ZMQ通信都发生在单个线程中,而另一个每个进程的线程通信回主线程以供ZMQ发送回到客户端。后一种情况将是" ZMQ方式",前者需要更多的箍才能正常工作。
如果您希望所有ZMQ通信都在一个线程中发生,那么您只需要在连接时跟踪新客户端,启动线程以及与该线程的通信(这可能通过单独进行) 一对ZMQ套接字,如果你愿意),然后当客户端断开连接时,关闭线程。作为一种建筑,相当直接。
如果您希望让每个线程都将ZMQ通信处理回客户端,那么事情会变得有些毛茸茸。您不能服务器上的单个套接字可供所有线程使用,每个线程用于同时与其客户端进行通信。 ZMQ套接字不是线程安全的。它们一次是由一个线程连续使用,并且建议不要在线程之间传递它们(但可以通过执行完整的内存屏障来完成 - 不确定在python中完成此操作需要什么,如果它可能;它是suggested here Python GIL 可以完成这个"免费" - 如果您选择依赖该行为祝你好运。
这样做的方式" ZMQ方式"将接受主线程中的传入连接,使用 new 套接字启动一个线程(它可以使用相同的ZMQ上下文, 线程安全),回传向客户端绑定新端口,让客户端与主套接字断开连接并重新连接到新线程中的套接字。当它断开连接时,让该线程终止。有点像kludge,但如果这是你所追求的,那就是可行的。
如果这些方法中的任何一种适合您,我将使用DEALER(客户端)/ ROUTER(服务器)作为套接字类型来支持完全异步通信。 Chapter 4 of the guide为您提供了一些可能的沟通模式,以实现各种目标。