【发布时间】:2021-03-25 17:28:31
【问题描述】:
我正在构建一个简单的星型客户端-服务器拓扑。
这个想法是客户端连接到服务器,可以发送消息,并且服务器可以向它们发送消息,当服务器决定时。客户端的数量会相对较少,大约 30 个,但数量太多以至于将所有传出数据发送给所有人是不明智的。我敢肯定我只是头脑简单,但这对于 ZeroMQ 来说似乎是完全不可能的。
最后一部分是this question没有提供答案的原因。
问题是这样的:
我可以使用ROUTER 套接字来接收来自客户端的消息。这也带有身份证明。但是,我不能使用同一个套接字进行发送,因为 ZeroMQ 套接字不是线程安全的。 IE。我不能让一个线程等待传入消息,而另一个线程则从服务器本身发送传出消息。我不知道我可以以任何方式等待阻塞 - socket.recv(),例如队列上的 .get() - 同时在 python 中的单个线程上。也许有办法做到这一点。
使用两个套接字 - 一个传入一个传出 - 也不起作用。标识不会在套接字之间共享,因此即使只有一次,仍必须轮询发送套接字以获取客户端 ID 映射。我们显然不能为每个客户端使用自己的端口。服务器似乎无法出于自己的意愿向单个客户端发送消息。
(订阅主题也是一个死主意:消息过滤是在客户端执行的,服务器只会淹没所有客户端网络)
最终,TCP 套接字可以轻松处理这种异步情况,但是在 python 上构建有效的消息框架是一场噩梦。我所追求的只是一个可靠的套接字,它可以处理消息,并且具有明确定义的故障模式。
【问题讨论】:
-
嗯。似乎一个可以使用一个路由器套接字来对抗外界调用这个S,并像这样工作:创建一个辅助套接字对用于进程内部通信。调用此 AB,将传出消息放入 A,然后轮询套接字联合 (S,B),如果 S,则从外部接收,或者如果 B,则将其放入 S。现在只有一个线程接触过 S ,或任何其他套接字,并且我们知道客户端标识符。
标签: python asynchronous networking zeromq