def fn(): intercept_strand = yield tap.CallFork(intercepter) yield tap.Cancel(intercept_strand) recv_strand = yield tap.CallFork(receiver) # even though this is forked, it doesn't end up hanging yield tap.Call(broadcaster, (5, )) # this gets intercepted and never gets injected yield tap.Join(recv_strand)
def fn(): intercept_strand = yield tap.CallFork(intercepter) yield tap.Cancel(intercept_strand) recv_strand = yield tap.CallFork(receiver) # even though this is forked, it doesn't end up hanging yield tap.Call(broadcaster, (5, )) value = yield tap.Join(recv_strand) assert value == 5 # did *not* get intercepted return value
def fn(): intercept_strand = yield tap.CallFork(intercepter) recv_strand = yield tap.CallFork(receiver) # even though this is forked, it doesn't end up hanging broadcast_strand = yield tap.CallFork(broadcaster, (5, )) value = yield tap.Join(recv_strand) assert value == "real" # got intercepted yield tap.Join(intercept_strand) yield tap.Cancel(broadcast_strand) return value
def acquire(x, to_cancel): yield tap.Receive(str(x)) release = yield lock.Acquire() nonlocal a a += 5 yield tap.Sequence([ tap.Receive(str(x)), tap.Sequence([ tap.Cancel(to_cancel), release, ]) if to_cancel is not None else release ])
def fn(): yield q.Put(3) t1 = yield tap.CallFork(put, (5, )) t2 = yield tap.CallFork(put, (7, )) yield tap.Sleep(0) assert (yield q.Get()) == 3 assert (yield q.Get()) == 5 yield tap.Cancel(t2) # too late assert (yield q.Get()) == 7 yield tap.Join([t1]) t = yield tap.Fork(q.Get()) yield q.Put(3) assert (yield tap.Join(t)) == 3
def fn(): yield q.Put(3) t1 = yield tap.CallFork(put, (5, )) t2 = yield tap.CallFork(put, (7, )) t3 = yield tap.CallFork(put, (9, )) yield tap.Sleep(0) assert (yield q.Get()) == 3 yield tap.Cancel(t2) # not too late to cancel assert (yield q.Get()) == 5 assert (yield q.Get()) == 9 yield tap.Join([t1, t3]) t = yield tap.Fork(q.Get()) yield q.Put(3) assert (yield tap.Join(t)) == 3
def fn(): yield tap.CallFork(acquire) t = yield tap.CallFork(acquire) yield tap.CallFork(acquire) yield tap.Sleep(0) assert a == 5 yield tap.Cancel(t) yield tap.Broadcast("unlock") yield tap.Sleep(0.01) assert a == 10 yield tap.Broadcast("unlock") yield tap.Sleep(0.001) assert a == 10
def fn(): t1 = yield tap.CallFork(acquire, (1, None)) t2 = yield tap.CallFork(acquire, (2, t1)) t3 = yield tap.CallFork(acquire, (3, None)) yield tap.Broadcast("2") yield tap.Broadcast("1") yield tap.Sleep(0.001) assert a == 5 yield tap.Broadcast("3") yield tap.Broadcast( "2") # this simultaneously tries to cancel 1 and unlocks yield tap.Sleep(0.01) assert a == 10 yield tap.Broadcast("1") # 1 gets canceled after the acquire, so it's too late to release yield tap.Sleep(0.001) assert a == 10 # yield tap.Join([t1, t2, t3]) yield tap.Cancel(t3)
def fn(): t = yield tap.Fork( tap.Sequence([ tap.CallThread(thread_fn), tap.CallThread(thread_fn), ])) yield tap.Sleep(0.01) assert a == 0 with cv: cv.notify() cv.wait() assert a == 1 # this cancels the second one, but not the first yield tap.Cancel(t) with cv: cv.notify() cv.wait() assert a == 2 with cv: cv.notify() yield tap.Sleep(0.1) assert a == 2
def fn(): assert not q.has_work() t1 = yield tap.CallFork(pop_and_add) t2 = yield tap.CallFork(pop_and_add) t3 = yield tap.CallFork(pop_and_add) yield tap.Sleep(0) assert a == 0 yield q.Put(3) assert a == 3 yield tap.Cancel(t2) yield q.Put(5) assert a == 8 yield q.Put(5) assert a == 8 t4 = yield tap.CallFork(pop_and_add) yield tap.Sleep(0) assert a == 13 yield tap.Join([t1, t3, t4])
def fn(): task = yield tap.CallFork(wake_and_fork) yield tap.Receive("wake") yield tap.Cancel(task)
def fn(): strand = yield tap.CallFork(add_three, (5, )) yield tap.Broadcast('key') yield tap.Broadcast('key') yield tap.Cancel(strand)
def fn(): t = yield tap.CallFork(acquire) yield tap.Sleep(0.001) yield tap.Cancel(t) t = yield tap.CallFork(acquire) yield tap.Sleep(0.001)