def actor_fn(self, pipe, arg): internal_pipe = Zsock(pipe, False) # We don't own the pipe, so False. arg = string_at(arg) global port zyre_node = Zyre(None) zyre_node.set_header (b"TS-PORT", str(port).encode()); zyre_node.start() zyre_node.join(b"broadcast") zyre_node.join(b"sync") zyre_pipe = zyre_node.socket() poller = Zpoller(zyre_pipe, internal_pipe) internal_pipe.signal(0) print('ZYRE Node started') terminated = False while not terminated: # time.sleep(1) # sock = poller.wait(1000) # if not sock: # continue # # # ZYRE receive # # if sock == zyre_pipe: e = ZyreEvent(zyre_node) # ANY if e.type() != b"EVASIVE": e.print() pass # ENTER: add to phonebook for external contact (i.e. TimeSync) if e.type() == b"ENTER": self.timebook.newpeer(e.peer_uuid(), e.peer_addr(), e.header(b"TS-PORT")) # EXIT elif e.type() == b"EXIT": print( "ZYRE Node: peer is gone..") # JOIN elif e.type() == b"JOIN": # SYNC clocks if e.group() == b"sync": pass self.timebook.sync(e.peer_uuid()) # LEAVE elif e.type() == b"LEAVE": print("ZYRE Node: peer left a group..") # SHOUT -> process event elif e.type() == b"SHOUT" or e.type() == b"WHISPER": # Parsing message data = json.loads(e.msg().popstr().decode()) data['from'] = e.peer_uuid() # add group if e.type() == b"SHOUT": data['group'] = e.group().decode() else: data['group'] = 'whisper' self.eventProc(data) # # # # # # INTERNAL commands # # # elif sock == internal_pipe: # msg = Zmsg.recv(internal_pipe) # if not msg: break # # command = msg.popstr() # if command == b"$TERM": # print('ZYRE Node TERM') # break # # elif command == b"JOIN": # group = msg.popstr() # zyre_node.join(group) # # elif command == b"LEAVE": # group = msg.popstr() # zyre_node.leave(group) # # elif command == b"SHOUT": # group = msg.popstr() # data = msg.popstr() # zyre_node.shouts(group, data) # # # if own group -> send to self too ! # groups = zlist_strlist( zyre_node.own_groups() ) # if group.decode() in groups: # data = json.loads(data.decode()) # data['from'] = 'self' # data['group'] = group.decode() # self.eventProc(data) # zyre_node.stop() # HANGS ! internal_pipe.__del__() zyre_node.__del__() print('ZYRE Node stopped') # WEIRD: print helps the closing going smoothly.. self.done = True