zeroMQ初体验-11.节点间的协作
上一篇讲到了线程间的协作,通过zeroMQ的pair模式可以很优雅的实现。而在各节点间(进程级),则适用度不高(虽然也能用)。这里给出了两个理由:
1.节点间是可以调节的,而线程间不是(线程是稳定的),pair模式是非自动连接的.
2.线程数是固定的,可预估的。而节点则是变动、不可预估的。
由此得出结论:pair适用于稳定、可控的环境。
所以,有了本章节。不知诸位还记得前面所讲的发布/订阅模式,在那里曾说过这种模式是不太稳定的(主要是指初始阶段),容易在连接未建立前就发布、废弃部分数据。在这里,通过节点间的协作来解决那个难题。
模型图:
发布端:
import?zmqSUBSCRIBERS_EXPECTED?=?2def?main():????context?=?zmq.Context()????????publisher?=?context.socket(zmq.PUB)????publisher.bind('tcp://*:5561')????syncservice?=?context.socket(zmq.REP)????syncservice.bind('tcp://*:5562')????subscribers?=?0????while?subscribers?<?SUBSCRIBERS_EXPECTED:????????msg?=?syncservice.recv()????????syncservice.send('')????????subscribers?+=?1????????print?"+1?subscriber"????????for?i?in?range(1000000):???????publisher.send('Rhubarb');????publisher.send('END')if?name?==?'main':????main()import?zmqdef?main():????context?=?zmq.Context()????????subscriber?=?context.socket(zmq.SUB)????subscriber.connect('tcp://localhost:5561')????subscriber.setsockopt(zmq.SUBSCRIBE,?"")????syncclient?=?context.socket(zmq.REQ)????syncclient.connect('tcp://localhost:5562')????????syncclient.send('')????????syncclient.recv()????nbr?=?0????while?True:????????msg?=?subscriber.recv()????????if?msg?==?'END':????????????break????????nbr?+=?1????????print?'Received?%d?updates'?%?nbrif?name?==?'main':????main()