pair 线程间的信令 这个套接字,是仅仅存在于inproc 的协议当中的,也就是说,线程间的信令是没有办法拓展到ipc 进程间的
×××××××××××××××××××××××××××××××××××××线程间的同步×××××××××××××××××××××××××××××××××××××
注意的以下几点:
1、两线程通过inproc 使用的是共享的上下文
2、父线程创建一个套接字,将其绑定到一个inproc 的一个短点然后启动他
3、子线程创建第二个套接字,将它连接到该端点的inproc 的端点上,然后告诉父线程我已经准备就绪
×××××××××××××××××××××××××××××进程间通信,松耦合的应用××××××××××××××××××××××××××××××××××××
其中自己的线程有自己的上下文,并且通过ipc 或者tcp 进行通信
这种情况下,我们就用ipc 或者其他的方式进行同步,下面举一个例子,是节点协调的例子
×××××××××××××××××××××××××××××××举个例子×××××××××××××××××××××××××××××××××××××××××××××
1、采用的模式
我们采用的是pub-sub的模式
2、遇到的问题
,我们将起放在两个进程中进行启动,但是容易出现当我们的sub 还正在连接的过程中的时候,我们就已经进行了数据的发布,这种情况是极其不佳的,因此,我们采用的是,希望有一种机制能够将起进行同步起来
3、解决方案
4、实际代码(python)
pub
#
# Synchronized publisher
#
import zmq
# We wait for 10 subscribers
SUBSCRIBERS_EXPECTED = 10
def main():
context = zmq.Context()
# Socket to talk to clients
publisher = context.socket(zmq.PUB)
# set SNDHWM, so we don't drop messages for slow subscribers
publisher.sndhwm = 1100000
publisher.bind('tcp://*:5561')
# Socket to receive signals
syncservice = context.socket(zmq.REP)
syncservice.bind('tcp://*:5562')
# Get synchronization from subscribers
subscribers = 0
while subscribers < SUBSCRIBERS_EXPECTED:
# wait for synchronization request
msg = syncservice.recv()
# send synchronization reply
syncservice.send(b'')
subscribers += 1
print("+1 subscriber (%i/%i)" % (subscribers, SUBSCRIBERS_EXPECTED))
# Now broadcast exactly 1M updates followed by END
for i in range(1000000):
publisher.send(b'Rhubarb')
publisher.send(b'END')
if __name__ == '__main__':
main()
sub
#
# Synchronized subscriber
#
import time
import zmq
def main():
context = zmq.Context()
# First, connect our subscriber socket
subscriber = context.socket(zmq.SUB)
subscriber.connect('tcp://localhost:5561')
subscriber.setsockopt(zmq.SUBSCRIBE, b'')
time.sleep(1)
# Second, synchronize with publisher
syncclient = context.socket(zmq.REQ)
syncclient.connect('tcp://localhost:5562')
# send a synchronization request
syncclient.send(b'')
# wait for synchronization reply
syncclient.recv()
# Third, get our updates and report how many we got
nbr = 0
while True:
msg = subscriber.recv()
if msg == b'END':
break
nbr += 1
print ('Received %d updates' % nbr)
if __name__ == '__main__':
main()