python - 如何使用 ZeroMQ 从父进程中的多个线程收集数据,同时保持解决方案尽可能简单且可扩展?

标签 python multithreading zeromq pyzmq

父进程启动几十个接收数据的线程(最多几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/

相关文章:

java - 同步实现: Java

c++ - ZeroMQ - .lib 文件丢失

c# - ZeroMQ线程/任务建议

tcp - 多人游戏开发中的 ZeroMQ

python - 需要帮助动态调整我的文本大小以适合 tkinter Canvas

Python NumPy : referencing columns

python - 如何在python中离线地理编码?

multithreading - Kotlin中,一个线程一次只能运行一个协程?

java - 将线程类中的字符串值附加到 jtextArea

python - Django SQLite 测试异常 : Different path of execution?