这个是 PUSH/PULL 模式,又叫做pipeline管道模式,取其一去不回头之意,一推一拉,数据滚滚向前。
这种socket封装的原本用意呢,是把数据交给一组worker端干活,PUSH会把任务均匀的(这个好像是zmq的招牌)的分配给下游的worker们,保证大家都有活干,图:
Producer:产生代处理数据,并将数据push出去
consumer(worker):pull到来自producer的数据,处理后,push出去
resultcolltor:pull到consumer的数据处理结果
Producer:
import time import zmq def producer(): context = zmq.Context() zmq_socket = context.socket(zmq.PUSH) zmq_socket.bind("tcp://127.0.0.1:5557") # 开始Producer之前必须先启动resultcollector和consumer for num in xrange(2000): work_message = { 'num' : num } zmq_socket.send_json(work_message) producer()
consumer:
import time import zmq import random def consumer(): consumer_id = random.randrange(1,10005) print "I am consumer #%s" % (consumer_id) context = zmq.Context() # recieve work consumer_receiver = context.socket(zmq.PULL) consumer_receiver.connect("tcp://127.0.0.1:5557") # send work consumer_sender = context.socket(zmq.PUSH) consumer_sender.connect("tcp://127.0.0.1:5558") while True: work = consumer_receiver.recv_json() data = work['num'] result = { 'consumer' : consumer_id, 'num' : data} if data%2 == 0: consumer_sender.send_json(result) consumer()
resultcollector:
import time import zmq import pprint def result_collector(): context = zmq.Context() results_receiver = context.socket(zmq.PULL) results_receiver.bind("tcp://127.0.0.1:5558") collecter_data = {} for x in xrange(1000): result = results_receiver.recv_json() if collecter_data.has_key(result['consumer']): collecter_data[result['consumer']] = collecter_data[result['consumer']] + 1 else: collecter_data[result['consumer']] = 1 if x == 999: pprint.pprint(collecter_data) result_collector()
run起来:
python resultcollector.py python consumer.py python consumer.py python producer.py
Producer的2000个数交给consumer处理(就是排除奇数),然后汇集到resultcollector,看下结果:
{ 3362: 233, 9312: 767 }
consumer:3362 处理 233,consumer:9312 处理767,结果还行,呵呵
注意一点就是,下游要先于上游开启,否则数据就丢了。感觉zmq对socket的这几种封装,有些场景还是挺适用,可以自由组装。有机会尝试一下。
相关推荐
标题中的"支持中文路径push/pull的adb"正是针对这一问题的解决方案。 "支持中文路径的push和pull"意味着这个ADB版本已经经过修改,能够正确处理包含中文字符的文件路径。在Windows环境下,由于文件系统编码的问题,...
服务端所在socket.core.Server命名空间下,分别为三种模式 push/pull/pack 客户端所在socket.core.Client命名空间下,分别为三种模式 push/pull/pack 主要流程与对应的方法和事件介绍. 注:connectId(int)代表着...
基于RFID技术借鉴单工厂多阶段生产存储系统的Push/Pull策略,以供应链分销网络三级库存系统为例设计了8种RFID使能的Push/Pull混合控制策略。为得到各策略的更优性能,采用基于仿真的粒子群优化方法对各策略参数进行了...
【解决】当设备已root使用adb命令, 提示'adbd cannot run as root in production builds',adb push /adb pull 到系统目录 解决方案 解压密码:hkxgame.com
最后一个项目是一个使用PUSH / PULL套接字 ( 0MQ ) 和 Node.js 集群技术的程序。 任务 启动一个由 3 个工人组成的池并在他们之间分配 30 个工作(整个程序可能不到 100 行代码) 主进程应该: 创建一个 PUSH 套接...
- Fixed push/pull for some Custom Shapes - Fixed moving some Custom Shapes - Fixed push/pull in Groups with hidden Widgets - Fixed push/pull for some flip animations - Fixed using resize animation ...
### 应用笔记LAT1319+Push-Pull模式在全桥峰值电流控制中的应用 #### 一、概述 本应用笔记旨在介绍如何利用Push-Pull模式解决全桥变换器在峰值电流控制中遇到的问题。具体而言,针对客户的需求——在全桥变换器的...
PUSH-PULL变压器是一种双端驱动的电路结构,适用于高功率应用,能提供良好的功率输出和低失真。 首先,设计条件包括输入电压来源于8节12V电池,电压范围在80-110V之间。输出电压设定为±380V,而输出功率需求为2100...
详细介绍了推挽变换器(push-pull)开关元件mosfet漏极尖峰电压的产生原理、测量方法、缓冲电路设计步骤、元件的选型计算方法等。
本篇文章将深入探讨ZeroMQ/jzmq在Java中的应用,通过分析提供的"req/rep"、"pub/sub"、"push/pull"模式及代理和多数据源的示例,来帮助初学者快速理解其工作原理。 1. **req/rep模式**: 在req/rep(请求/响应)...
级联式推挽变换器,通过推挽变换器输入并联输出串联的方式实现低电压大电流输入,大电压小电流输出
然而,当涉及到处理包含中文字符的文件名时,`adb push`和`adb pull`命令可能会出现乱码问题,导致文件无法正常传输。这个问题主要源于ADB默认使用ASCII编码,而中文字符通常需要UTF-8或者其他多字节编码来表示。 ...
在 Crystal Reports 中,有两种主要的数据访问模式:Pull 模式和 Push 模式。本篇将详细讲解 Crystal Report 的 Push 模式及其相关知识点。 Push 模式,也称为数据推送模式,是一种由应用程序控制数据流的方式。在 ...
在水晶报表中,"Pull"和"Push"方法是两种不同的数据获取策略,它们各自有着不同的特点和应用场景。 1. **Pull方法**: Pull方法也被称为“拉”模式,它是由水晶报表自身从数据源中检索数据。在这种模式下,水晶...
然而,随着ADB的不断更新和完善,现在已经能够很好地支持中文`pull`和`push`操作,解决了中文路径和文件名的兼容性问题。 `pull`命令是ADB用来从Android设备上下载文件到电脑的,而`push`则是将电脑上的文件上传到...
它允许对你所有的镜像进行细颗粒度控制,你可以决定哪个用户和团队可 push/pull 镜像。轻松管理用户。 在 Portus 映射你的公司,可以定义任意数量的 team,并从 team 添加和移除用户。Team 有三种类型的用户:...
在实际应用中,很多软件往往结合使用Pull和Push两种技术。例如,电子邮件应用通常采用Pull策略来检查新邮件,但也可以通过Push通知用户有未读邮件。这样既可以节省资源,又能够提供及时的通知。 总的来说,Pull与...
### 论文知识点总结 ...综上所述,本论文通过对Pull与Push两种AJAX数据更新机制的深入研究,为开发者提供了有价值的参考依据,有助于他们根据实际需求选择最适合的技术方案,从而提升应用的整体性能和用户体验。
《Go语言封装Pushover API详解》 在Go语言的开发过程中,我们经常需要与各种第三方服务进行交互,其中Pushover API是一个广泛使用的即时通知服务,它允许开发者将消息推送到用户的手机或桌面设备上。本篇文章将深入...
Push or Pull ?.md