From d286dc3fd9b2598353a3ff8abea64cb1524a18f8 Mon Sep 17 00:00:00 2001 From: bel Date: Sun, 10 Apr 2022 22:05:15 -0600 Subject: [PATCH] multi cb'er and file-append based since file queues exist --- poc/main.py | 80 +++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 63 insertions(+), 17 deletions(-) diff --git a/poc/main.py b/poc/main.py index d6b1fe4..68a651b 100644 --- a/poc/main.py +++ b/poc/main.py @@ -1,6 +1,30 @@ from sys import stdin, stdout +import signal +from os import getpid, kill import time +def main(stream): + bucket = None + N = 3 + R = 2 + T = 2 + triggered = CBAppend("/tmp/cbappend.triggered.txt") + triggered = CBAppend("/tmp/cbappend.both.txt") + released = CBAppend("/tmp/cbappend.both.txt") + cb = CBFork(triggered, released) + bucket = Bucket(N, R, T, cb.cb()) + + while readline(): + print("bucket.push():", bucket.push()) + stdout.flush() + +def readline(): + try: + line = input() + return True + except EOFError: + return False + class Bucket: def __init__(self, N, R, T, CB): self.q = 0.0 @@ -36,7 +60,6 @@ class Bucket: if self.q+c > self.N: return False self.q += c - print(f"{int(self.q)} = + {int(c+.5)}") return True def __pop(self): @@ -45,29 +68,52 @@ class Bucket: if remove_up_to > self.q: remove_up_to = self.q self.q -= remove_up_to - print(f"{int(self.q)} = - {int(remove_up_to+.5)}") self.__last_pop = now def __now(self): return time.time() -def main(stream): - bucket = None - N = 3 - R = 2 - T = 1 - bucket = Bucket(N, R, T, lambda state: print(f"state is now {state} ({bucket.state()}), q={bucket.q}")) +class CBSignals(): + def __init__(self, pid, signal_triggered, signal_released): + self.__pid = pid + self.__signal_triggered = signal_triggered + self.__signal_released = signal_released - while readline(): - bucket.push() - stdout.flush() + def cb(self): + def cb(state): + print(f"state is now {state}") + kill( + self.__pid, + self.__signal_triggered if state else self.__signal_released, + ) + handler = lambda s, f: print("SIGNAL:", s) + signal.signal(self.__signal_triggered, handler) + signal.signal(self.__signal_released, handler) + return cb -def readline(): - try: - line = input() - return True - except EOFError: - return False +class CBAppend(): + def __init__(self, path): + self.__path = path + + def cb(self): + def cb(state): + with open(self.__path, "a") as f: + f.write(f"{state}\n") + return cb + +class CBFork(): + def __init__(self, triggered, released): + self.__triggered = triggered + self.__released = released + + def cb(self): + cb_triggered = self.__triggered.cb() + cb_released = self.__released.cb() + def cb(state): + if state: + return cb_triggered(state) + return cb_released(state) + return cb if __name__ == "__main__": main(stdin)