父进程启动几十个接收数据的线程(最多几KB,每秒10个请求),这些数据必须收集在父进程的列表中。实现这一目标的推荐方法是什么?它是高效的、异步的、非阻塞的,并且更容易实现且开销最小?
ZeroMQ 指南建议使用 PAIR
套接字原型(prototype)来协调线程,但是
如何扩展几百个线程?
最佳答案
没有免费晚餐
即使某些营销方案提供了这一点,也不要认为这是理所当然的。
高效通常意味着复杂的资源处理。
最简单的实现通常会与开销和高效的资源处理作斗争。
<小时/>最简单?
按照亨利·福特爵士的观点,设计中不存在的组件根本不会失败。
从这个意义上说,我们在这里努力不以编程方式控制任何超出智能 ZeroMQ 库的基本组件的最简单使用的东西:
<强> Scenario SIMPLEST:
Rule a)
中央HQ
-unit(无论是一个线程还是完全隔离的进程) .bind()
-s 它的接收端口(预设为 ZMQ_SUBSCRIBE
行为原型(prototype) )并“订阅”它的主题过滤器到“所有内容” .setsockopt( ZMQ_SUBSCRIBE, "" )
在它产生第一个 DAQ
之前-{ 线程 |处理},进一步引用为 DAQ
-单位。
Rule b)
每个DAQ
-unit 只是 .connect()
-s 到 HQ
上已设置并准备就绪的端口- 具有单元本地套接字访问端口的单元,预设为 ZMQ_PUBLISH
行为原型(prototype)。
Rule c)
任意 DAQ
-unit 只是 .send( ..., ZMQ_NOBLOCK )
-s 根据需要它是通过消息的本地数据,该消息在后台由 ZeroMQ 层传递到 HQ
的手中-unit,正在排队并可在 HQ
进行进一步处理-单位意志。
Rule d)
HQ
-unit 定期循环和 .poll( 1 )
-s 表示存在从任何 DAQ
收集的消息-单位 + <强> .recv( ZMQ_NOBLOCK )
以防出现任何此类情况。
仅此而已
Asynchronous
:是的。
Non-blocking
:是的。
Simplest
:是的。
Scaleable
:是的。 几乎是线性的,直到 I/O 限制
(仍然可以进行一些调整来处理压力 I/O 操作) 作为奖励积分...
关于python - 如何使用 ZeroMQ 从父进程中的多个线程收集数据,同时保持解决方案尽可能简单且可扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36593464/