Esempio n. 1
0
    def test_acquire_callback(self):
        # Test that callbacks passed to acquire() run immediately after
        # release(), and that wait() callbacks aren't run until a release()
        # with no waiters on acquire().
        sem = toro.Semaphore(0)
        history = []
        sem.acquire().add_done_callback(make_callback('acquire1', history))
        sem.acquire().add_done_callback(make_callback('acquire2', history))

        def wait_callback(name):
            def cb(_):
                self.assertFalse(sem.locked())
                history.append(name)
            return cb

        sem.wait().add_done_callback(wait_callback('wait1'))
        sem.wait().add_done_callback(wait_callback('wait2'))
        sem.release()
        history.append('release1')
        sem.release()
        history.append('release2')
        sem.release()
        history.append('release3')
        self.assertEqual([
            # First release wakes first acquire
            'acquire1', 'release1',

            # Second release wakes second acquire
            'acquire2', 'release2',

            # Third release wakes all waits
            'wait1', 'wait2', 'release3'
        ], history)
Esempio n. 2
0
 def test_release_twice(self):
     s = toro.Semaphore()
     result = []
     s.acquire().add_done_callback(lambda x: result.append('a'))
     s.release()
     s.acquire().add_done_callback(lambda x: result.append('b'))
     s.release()
     yield gen.Task(self.io_loop.add_timeout, time.time() + 0.01)
     self.assertEqual(result, ['a', 'b'])
Esempio n. 3
0
    def test_context_manager_contended(self):
        toro_obj = toro.Semaphore()
        history = []
        n_coroutines = 10

        @gen.coroutine
        def f(i):
            with (yield toro_obj.acquire()):
                history.append('acquired %d' % i)
                yield pause(timedelta(seconds=0.01))
                history.append('releasing %d' % i)

        yield [f(i) for i in range(n_coroutines)]

        expected_history = []
        for i in range(n_coroutines):
            expected_history.extend(['acquired %d' % i, 'releasing %d' % i])

        self.assertEqual(expected_history, history)
Esempio n. 4
0
 def test_repr(self):
     # No exceptions
     str(toro.Semaphore())
     repr(toro.Semaphore())
Esempio n. 5
0
 def test_timeout_acquire(self):
     s = toro.Semaphore(value=0)
     with assert_raises(toro.Timeout):
         yield s.acquire(deadline=timedelta(seconds=0.01))