Router Client

import threading
import time

import zmq

from agents import Message, PowerfulAgent


class Router(PowerfulAgent):
    def setup(self, name=None, address=None):
        self.create_router(address)


class Client1(PowerfulAgent):
    def setup(self, name=None, address=None):
        self.counter = 0
        self.client = self.create_client(address)

        # begin sending forever, add to managed threads for graceful cleanup
        t = threading.Thread(target=self.send_forever)
        self.threads.append(t)
        t.start()

    def send_forever(self):
        # use exit event to gracefully exit loop and graceful cleanup
        while not self.exit_event.is_set():
            time.sleep(1)
            self.counter += 1
            target = "client2"
            self.log.info(f"send to {target}: {self.counter}")
            self.client.send(Message.client(name=target, payload=self.counter))


class Client2(PowerfulAgent):
    def setup(self, name=None, address=None):
        self.client = self.create_client(address)
        self.client.observable.subscribe(
            lambda x: self.log.info(f"received: {x['payload']}")
        )


if __name__ == "__main__":
    router = Router(name="router", address="tcp://0.0.0.0:5000")
    client1 = Client1(name="client1", address="tcp://0.0.0.0:5000")
    client2 = Client2(name="client2", address="tcp://0.0.0.0:5000")