def test_stopped(self): class Fast(Runnable): def next(self, state, **runopts): time.sleep(0.1) return state.updated(x=state.x + 1) class Slow(Runnable): def init(self, state, **runopts): self.time_to_stop = threading.Event() def next(self, state, **runopts): self.time_to_stop.wait() return state.updated(x=state.x + 2) def halt(self): self.time_to_stop.set() # default case rb = RacingBranches(Slow(), Fast(), Slow()) res = rb.run(State(x=0)).result() self.assertEqual([s.x for s in res], [2, 1, 2]) # "endomorphic case" rb = RacingBranches(BlockingIdentity(), Slow(), Fast(), Slow()) res = rb.run(State(x=0)).result() self.assertEqual([s.x for s in res], [0, 2, 1, 2])
def test_stopped(self): class Fast(Runnable): def next(self, state): time.sleep(0.1) return state.updated(x=state.x + 1) class Slow(Runnable): def init(self, state): self.time_to_stop = threading.Event() def next(self, state): self.time_to_stop.wait() return state.updated(x=state.x + 2) def stop(self): self.time_to_stop.set() # standard case rb = RacingBranches(Slow(), Fast(), Slow()) res = rb.run(State(x=0)).result() self.assertEqual([s.x for s in res], [0, 2, 1, 2]) # branches' outputs are of a different type that the inputs # (i.e. non-endomorphic racing branches) rb = RacingBranches(Slow(), Fast(), Slow(), endomorphic=False) res = rb.run(State(x=0)).result() self.assertEqual([s.x for s in res], [2, 1, 2])