From: A. Jesse Jiryu Davis Date: Sun, 15 Mar 2015 21:41:55 +0000 (-0400) Subject: put() doesn't defer unblocking get(). X-Git-Tag: v4.2.0b1~60^2~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d8666b4e02040350ada07794d016ae2b4ad39ec0;p=thirdparty%2Ftornado.git put() doesn't defer unblocking get(). --- diff --git a/tornado/queues.py b/tornado/queues.py index e2aec50af..562fc6c55 100644 --- a/tornado/queues.py +++ b/tornado/queues.py @@ -129,11 +129,7 @@ class Queue(object): if self.qsize(): future = Future() - # Defer unblocking the getter, which might do task_done() without - # yielding first. We want putters to have a chance to run first and - # keep join() blocked. See test_producer_consumer(). - ioloop.IOLoop.current().add_callback( - partial(future.set_result, self._get())) + future.set_result(self._get()) return future else: future = Future() diff --git a/tornado/test/queues_test.py b/tornado/test/queues_test.py index 880db8224..34b611315 100644 --- a/tornado/test/queues_test.py +++ b/tornado/test/queues_test.py @@ -289,6 +289,20 @@ class QueueJoinTest(AsyncTestCase): yield q.join() self.assertEqual(sum(range(100)), self.accumulator) + @gen_test + def test_task_done_delay(self): + # Verify it is task_done(), not get(), that unblocks join(). + q = queues.Queue() + q.put_nowait(0) + join = q.join() + self.assertFalse(join.done()) + yield q.get() + self.assertFalse(join.done()) + yield gen.moment + self.assertFalse(join.done()) + q.task_done() + self.assertTrue(join.done()) + @gen_test def test_join_empty_queue(self): q = queues.Queue() @@ -310,8 +324,7 @@ class QueueJoinTest(AsyncTestCase): # We don't yield between get() and task_done(), so get() must wait for # the next tick. Otherwise we'd immediately call task_done and unblock # join() before q.put() resumes, and we'd only process the first four - # items. Consumers would normally yield in the course of processing an - # item, but it's worthwhile testing the degenerate case. + # items. @gen.coroutine def consumer(): while True: @@ -323,8 +336,8 @@ class QueueJoinTest(AsyncTestCase): for item in range(10): yield q.put(item) - producer() consumer() + yield producer() yield q.join() self.assertEqual(list(range(10)), history)