from state_management import Action, manager from abots.helpers import generator, coroutine, infinitedict from time import monotonic as time from gevent import Greenlet, spawn, sleep, joinall from gevent.queue import Queue, Empty #from queue import Queue, Empty HOOKS = dict() def reducer(state, action): if action.name == "ADD": state["counter"] = state.get("counter", 0) + action.data return state def register(func): #f = generator(func) #f.start() HOOKS[func.__name__.lower()] = func#f() return func #@coroutine def pull(queue): while True: task = queue.get() assert isinstance(task, tuple), f"Expected tuple: {task}" assert len(task) == 2, f"Invalid format: {task}" hook_name, message = task hook = HOOKS.get(hook_name) hook(queue, message) @generator def push(queue): task = (yield) assert isinstance(task, tuple), f"Expected tuple: {task}" assert len(task) == 2, f"Invalid format: {task}" queue.put(task) @register def ping(queue, message): print(f"PING: {message}") task = "pong", message queue.put(task) @register def pong(queue, message): print(f"PONG: {message}") task = "ping", message queue.put(task) state, dispatch = manager(reducer) queue = Queue() yang = push(queue) yin = spawn(pull, queue) start = lambda: joinall([yin])