예제 #1
0
 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)
예제 #2
0
 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
예제 #3
0
 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
예제 #4
0
 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
     ])
예제 #5
0
    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
예제 #6
0
    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
예제 #7
0
    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
예제 #8
0
    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)
예제 #9
0
 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
예제 #10
0
    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])
예제 #11
0
 def fn():
     task = yield tap.CallFork(wake_and_fork)
     yield tap.Receive("wake")
     yield tap.Cancel(task)
예제 #12
0
 def fn():
     strand = yield tap.CallFork(add_three, (5, ))
     yield tap.Broadcast('key')
     yield tap.Broadcast('key')
     yield tap.Cancel(strand)
예제 #13
0
 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)