import random, threading, time, zmq B = 32 # number of bits of precision in each random integer
def ones_and_zeros(digits): """Express `n` in at least `d` binary digits, with no special prefix.""" # getrandbits() # 方式回到特定尺寸(以位为企业)的整数金额。 return bin(random.getrandbits(digits)).lstrip('0b').zfill(digits)
# 发布者 def bitsource(zcontext, url): # 公布订阅涵数,发布者。 """Produce random points in the unit square.""" # 造就一个对象 。发布者对象 zsock = zcontext.socket(zmq.PUB) # 关联URL zsock.bind(url) while True: # 不断持续的一直推送这儿是32位系统的二进制标识符。 # 这儿一个字符串数组意味着一个点。 zsock.send_string(ones_and_zeros(B * 2)) # 间断0.01秒 。 time.sleep(0.01) # 订阅者1 def always_yes(zcontext, in_url, out_url): """Coordinates in the lower-left quadrant are inside the unit circle.""" # 造就一个订阅者对象。 isock = zcontext.socket(zmq.SUB) # 联接发布者的URL isock.connect(in_url) # 设定过虑标准 ,接收00开始的 # 假如开始为00得话,那麼这一点x、y值都不容易超出半经的一半 # 一定在四分之一圆内。 isock.setsockopt(zmq.SUBSCRIBE, b'00') # 消息推送 。 osock = zcontext.socket(zmq.PUSH) # 联接接收消息推送的URL osock.connect(out_url) while True: # 接收订阅者的信息。 isock.recv_string() # 消息推送给发布者信息。因而大家这儿立即推送Y osock.send_string('Y') # 订阅者2 def judge(zcontext, in_url, pythagoras_url, out_url): """Determine whether each input coordinate is inside the unit circle.""" # # 造就一个订阅者对象 。 isock = zcontext.socket(zmq.SUB) # 联接URL isock.connect(in_url) # 设定接收订阅的过虑标准。 for prefix in b'01', b'10', b'11': isock.setsockopt(zmq.SUBSCRIBE, prefix) # 设定一个回应对象。 psock = zcontext.socket(zmq.REQ) psock.connect(pythagoras_url) # 设定一个消息推送对象。 osock = zcontext.socket(zmq.PUSH) osock.connect(out_url) # 这儿用了勾股定理,是2个落在纵坐标上的点 ,平方和 。 unit = 2 ** (B * 2) # 这儿必须测算是不是在四分之一圆内。 while True: # 接收发布者的信息。 bits = isock.recv_string() # 获取这一点的x座标,y座标 。 n, m = int(bits[::2], 2), int(bits[1::2], 2) # 发给顾客要求端 psock.send_json((n, m)) # 随后接纳顾客要求端推送回来解决过的数据信息。 sumsquares = psock.recv_json() # 分辨是不是在圆内。 osock.send_string('Y' if sumsquares < unit else 'N') # 要求端, def pythagoras(zcontext, url): """Return the sum-of-squares of number sequences.""" zsock = zcontext.socket(zmq.REP) zsock.bind(url) while True: # 这儿先要求数据信息,随后将要求的数据信息开展解决推送出来 。 numbers = zsock.recv_json() zsock.send_json(sum(n * n for n in numbers)) # 归纳 ,开展测算π的值。 def tally(zcontext, url): """Tally how many points fall within the unit circle, and print pi.""" zsock = zcontext.socket(zmq.PULL) zsock.bind(url) # 这儿是假如接纳到一个Y p 4,接纳到一个N ,q 1 # 随后测算比率 ,这一便是大家算出去的π的值。 p = q = 0 while True: decision = zsock.recv_string() q = 1 if decision == 'Y': p = 4 print(decision, p / q)
# 大家应用线程同步的方法,上面的每一个涵数开一个进程, 。 def start_thread(function, *args): thread = threading.Thread(target=function, args=args) thread.daemon = True # so you can easily Ctrl-C the whole program thread.start()