Exchanging Messages: Advanced Usage¶
The examples here all refer to the
News from more than one source¶
Process A, B, C and D¶
import networkzero as nw0 import random import time import uuid name = "movement/%s" % uuid.uuid1().hex address = nw0.advertise(name) print("Sending from %s -> %s" % (name, address)) # # In lieu of an actual sensor! # while True: is_movement = random.random() > 0.5 nw0.send_news_to(address, "movement", (name, is_movement)) time.sleep(random.random())
import networkzero as nw0 addresses = [address for name, address in nw0.discover_group("movement")] while True: topic, (sensor, is_movement) = nw0.wait_for_news_from(addresses) if is_movement: print("Movement from %s!!!" % sensor)
A process can listen for news from more than one source. For example, if you have four movement sensors, one in each corner of a room, all ending their updates on the same channel, you can gather updates from all four at once.
import os, sys import tempfile import networkzero as nw0 address = nw0.advertise("gallery") print("Gallery:", address) while True: filename, data = nw0.wait_for_message_from(address, autoreply=True) bytes = nw0.string_to_bytes(data) temp_filepath = os.path.join(tempfile.gettempdir(), filename) with open(temp_filepath, "wb") as f: f.write(bytes) print("Wrote", temp_filepath)
import os, sys import networkzero as nw0 try: input = raw_input except NameError: pass gallery = nw0.discover("gallery") filepath = input("Filename: ") filename = os.path.basename(filepath) with open(filepath, "rb") as f: data = f.read() nw0.send_message_to(gallery, (filename, nw0.bytes_to_string(data)))
Sometimes the data you want to send isn’t text or numbers: it’s binary data—bytes—such as the bytes which make up an image or a sound file. To send that via networkzero you have to treat it specially: at the sending end, you convert it to a string; and at the receiving end, you convert it back into bytes.
import time import networkzero as nw0 address = nw0.advertise("poller1") while True: message = nw0.wait_for_message_from(address, wait_for_s=0) if message is not None: print("Received:", message) nw0.send_reply_to(address, "Received: %s" % message) break else: print("Doing other useful things ...") time.sleep(1)
import time import networkzero as nw0 service = nw0.discover("poller1") time.sleep(3) reply = nw0.send_message_to(service, "This is a message") print("Reply: ", reply)
By default, when you wait for a network message, your process blocks: that is, it won’t do anything else until a message arrives. Sometimes that’s perfectly sensible: if your robot can’t go anywhere until it knows where to go then the process must block until it receives an instruction.
Sometimes, though, you want to be able to get on with other things while waiting for a message to arrive on the network. There are several approaches to this in general: threading, asynchronous IO, event loops... and polling. Polling is the simplest of these and is easy to do with networkzero: you simply check for a message briefly before carrying on. If a message has arrived, you can act on it; otherwise, you do the other things you want to do (for example update your game screen, have your robot check its sensors, etc.)