Skip to content

Commit 5d2f5cc

Browse files
committed
Add C version of SimpleQueue
1 parent 9c3431b commit 5d2f5cc

File tree

5 files changed

+516
-8
lines changed

5 files changed

+516
-8
lines changed

Lib/queue.py

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,26 @@
88
from heapq import heappush, heappop
99
from time import monotonic as time
1010

11+
try:
12+
import _queue
13+
except ImportError:
14+
_queue = None
15+
1116
__all__ = ['Empty', 'Full', 'Queue', 'PriorityQueue', 'LifoQueue']
1217

13-
class Empty(Exception):
14-
'Exception raised by Queue.get(block=0)/get_nowait().'
15-
pass
18+
19+
try:
20+
Empty = _queue.Empty
21+
except AttributeError:
22+
class Empty(Exception):
23+
'Exception raised by Queue.get(block=0)/get_nowait().'
24+
pass
1625

1726
class Full(Exception):
1827
'Exception raised by Queue.put(block=0)/put_nowait().'
1928
pass
2029

30+
2131
class Queue:
2232
'''Create a queue object with a given maximum size.
2333
@@ -246,7 +256,7 @@ def _get(self):
246256
return self.queue.pop()
247257

248258

249-
class SimpleQueue:
259+
class _PySimpleQueue:
250260

251261
def __init__(self):
252262
self._queue = deque()
@@ -262,3 +272,9 @@ def get(self, block=True, timeout=None):
262272
if not self._count.acquire(block, timeout):
263273
raise Empty
264274
return self._queue.popleft()
275+
276+
277+
try:
278+
SimpleQueue = _queue.SimpleQueue
279+
except AttributeError:
280+
SimpleQueue = _PySimpleQueue

Lib/test/test_queue.py

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@
88
from test import support
99
threading = support.import_module('threading')
1010

11+
try:
12+
import _queue
13+
except ImportError:
14+
_queue = None
15+
1116
QUEUE_SIZE = 5
1217

1318
def qfull(q):
@@ -356,8 +361,7 @@ def test_failing_queue(self):
356361
self.failing_queue_test(q)
357362

358363

359-
class SimpleQueueTest(unittest.TestCase):
360-
type2test = queue.SimpleQueue
364+
class BaseSimpleQueueTest:
361365

362366
def setUp(self):
363367
self.q = self.type2test()
@@ -436,7 +440,7 @@ def wrapper(*args, **kwargs):
436440

437441
return results
438442

439-
def test_simple(self):
443+
def test_basic(self):
440444
q = self.q
441445
q.put(1)
442446
q.put(2)
@@ -488,12 +492,25 @@ def test_many_threads_nonblock(self):
488492
def test_many_threads_timeout(self):
489493
N = 50
490494
q = self.q
491-
inputs = list(range(10000))
495+
inputs = list(range(1000))
492496
results = self.run_threads(N, N, q, inputs,
493497
self.feed, self.consume_timeout)
494498

495499
self.assertEqual(sorted(results), inputs)
496500

497501

502+
class PySimpleQueueTest(BaseSimpleQueueTest, unittest.TestCase):
503+
type2test = queue._PySimpleQueue
504+
505+
506+
if _queue is not None:
507+
508+
class CSimpleQueueTest(BaseSimpleQueueTest, unittest.TestCase):
509+
type2test = _queue.SimpleQueue
510+
511+
def test_is_default(self):
512+
self.assertIs(self.type2test, queue.SimpleQueue)
513+
514+
498515
if __name__ == "__main__":
499516
unittest.main()

0 commit comments

Comments
 (0)