Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Queue -> SharedQueue
  • Loading branch information
ericsnowcurrently committed Feb 27, 2024
commit 18d4c8fdbb3e4ea37487c2ce355c4dec682101bc
13 changes: 8 additions & 5 deletions Lib/test/support/interpreters/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,19 +16,22 @@
'Interpreter',
'InterpreterError', 'InterpreterNotFoundError', 'ExecFailure',
'NotShareableError',
'create_queue', 'Queue', 'QueueEmpty', 'QueueFull',
'create_shared_queue', 'SharedQueue', 'QueueEmpty', 'QueueFull',
]


_queuemod = None

def __getattr__(name):
if name in ('Queue', 'QueueEmpty', 'QueueFull', 'create_queue'):
global create_queue, Queue, QueueEmpty, QueueFull
if name in ('QueueEmpty', 'QueueFull',
'SharedQueue', 'create_shared_queue'):
global QueueEmpty, QueueFull
global create_shared_queue, SharedQueue
ns = globals()
from .queues import (
create as create_queue,
Queue, QueueEmpty, QueueFull,
QueueEmpty, QueueFull,
create_shared as create_shared_queue,
SharedQueue,
)
return ns[name]
else:
Expand Down
14 changes: 7 additions & 7 deletions Lib/test/support/interpreters/queues.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
)

__all__ = [
'create', 'list_all',
'Queue',
'create_shared', 'list_all',
'SharedQueue',
'QueueError', 'QueueNotFoundError', 'QueueEmpty', 'QueueFull',
]

Expand All @@ -31,25 +31,25 @@ class QueueFull(_queues.QueueFull, queue.Full):
"""


def create(maxsize=0):
def create_shared(maxsize=0):
"""Return a new cross-interpreter queue.

The queue may be used to pass data safely between interpreters.
"""
qid = _queues.create(maxsize)
return Queue(qid)
return SharedQueue(qid)


def list_all():
"""Return a list of all open queues."""
return [Queue(qid)
return [SharedQueue(qid)
for qid in _queues.list_all()]



_known_queues = weakref.WeakValueDictionary()

class Queue:
class SharedQueue:
"""A cross-interpreter queue."""

def __new__(cls, id, /):
Expand Down Expand Up @@ -169,4 +169,4 @@ def get_nowait(self):
raise # re-raise


_queues._register_queue_type(Queue)
_queues._register_queue_type(SharedQueue)
8 changes: 4 additions & 4 deletions Lib/test/test_interpreters/test_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,14 @@ class ModuleTests(TestBase):

def test_queue_aliases(self):
first = [
interpreters.create_queue,
interpreters.Queue,
interpreters.create_shared_queue,
interpreters.SharedQueue,
interpreters.QueueEmpty,
interpreters.QueueFull,
]
second = [
interpreters.create_queue,
interpreters.Queue,
interpreters.create_shared_queue,
interpreters.SharedQueue,
interpreters.QueueEmpty,
interpreters.QueueFull,
]
Expand Down
74 changes: 37 additions & 37 deletions Lib/test/test_interpreters/test_queues.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,50 +20,50 @@ def tearDown(self):
pass


class QueueTests(TestBase):
class SharedQueueTests(TestBase):

def test_create(self):
with self.subTest('vanilla'):
queue = queues.create()
queue = queues.create_shared()
self.assertEqual(queue.maxsize, 0)

with self.subTest('small maxsize'):
queue = queues.create(3)
queue = queues.create_shared(3)
self.assertEqual(queue.maxsize, 3)

with self.subTest('big maxsize'):
queue = queues.create(100)
queue = queues.create_shared(100)
self.assertEqual(queue.maxsize, 100)

with self.subTest('no maxsize'):
queue = queues.create(0)
queue = queues.create_shared(0)
self.assertEqual(queue.maxsize, 0)

with self.subTest('negative maxsize'):
queue = queues.create(-10)
queue = queues.create_shared(-10)
self.assertEqual(queue.maxsize, -10)

with self.subTest('bad maxsize'):
with self.assertRaises(TypeError):
queues.create('1')
queues.create_shared('1')

def test_shareable(self):
queue1 = queues.create()
queue1 = queues.create_shared()

interp = interpreters.create()
interp.exec_sync(dedent(f"""
from test.support.interpreters import queues
queue1 = queues.Queue({queue1.id})
queue1 = queues.SharedQueue({queue1.id})
"""));

with self.subTest('same interpreter'):
queue2 = queues.create()
queue2 = queues.create_shared()
queue1.put(queue2)
queue3 = queue1.get()
self.assertIs(queue3, queue2)

with self.subTest('from current interpreter'):
queue4 = queues.create()
queue4 = queues.create_shared()
queue1.put(queue4)
out = _run_output(interp, dedent("""
queue4 = queue1.get()
Expand All @@ -74,7 +74,7 @@ def test_shareable(self):

with self.subTest('from subinterpreter'):
out = _run_output(interp, dedent("""
queue5 = queues.create()
queue5 = queues.create_shared()
queue1.put(queue5)
print(queue5.id)
"""))
Expand All @@ -83,40 +83,40 @@ def test_shareable(self):
self.assertEqual(queue5.id, qid)

def test_id_type(self):
queue = queues.create()
queue = queues.create_shared()
self.assertIsInstance(queue.id, int)

def test_custom_id(self):
with self.assertRaises(queues.QueueNotFoundError):
queues.Queue(1_000_000)
queues.SharedQueue(1_000_000)

def test_id_readonly(self):
queue = queues.create()
queue = queues.create_shared()
with self.assertRaises(AttributeError):
queue.id = 1_000_000

def test_maxsize_readonly(self):
queue = queues.create(10)
queue = queues.create_shared(10)
with self.assertRaises(AttributeError):
queue.maxsize = 1_000_000

def test_hashable(self):
queue = queues.create()
queue = queues.create_shared()
expected = hash(queue.id)
actual = hash(queue)
self.assertEqual(actual, expected)

def test_equality(self):
queue1 = queues.create()
queue2 = queues.create()
queue1 = queues.create_shared()
queue2 = queues.create_shared()
self.assertEqual(queue1, queue1)
self.assertNotEqual(queue1, queue2)


class TestQueueOps(TestBase):
class TestSharedQueueOps(TestBase):

def test_empty(self):
queue = queues.create()
queue = queues.create_shared()
before = queue.empty()
queue.put(None)
during = queue.empty()
Expand All @@ -130,7 +130,7 @@ def test_empty(self):
def test_full(self):
expected = [False, False, False, True, False, False, False]
actual = []
queue = queues.create(3)
queue = queues.create_shared(3)
for _ in range(3):
actual.append(queue.full())
queue.put(None)
Expand All @@ -144,7 +144,7 @@ def test_full(self):
def test_qsize(self):
expected = [0, 1, 2, 3, 2, 3, 2, 1, 0, 1, 0]
actual = []
queue = queues.create()
queue = queues.create_shared()
for _ in range(3):
actual.append(queue.qsize())
queue.put(None)
Expand All @@ -165,15 +165,15 @@ def test_qsize(self):

def test_put_get_main(self):
expected = list(range(20))
queue = queues.create()
queue = queues.create_shared()
for i in range(20):
queue.put(i)
actual = [queue.get() for _ in range(20)]

self.assertEqual(actual, expected)

def test_put_timeout(self):
queue = queues.create(2)
queue = queues.create_shared(2)
queue.put(None)
queue.put(None)
with self.assertRaises(queues.QueueFull):
Expand All @@ -182,7 +182,7 @@ def test_put_timeout(self):
queue.put(None)

def test_put_nowait(self):
queue = queues.create(2)
queue = queues.create_shared(2)
queue.put_nowait(None)
queue.put_nowait(None)
with self.assertRaises(queues.QueueFull):
Expand All @@ -191,20 +191,20 @@ def test_put_nowait(self):
queue.put_nowait(None)

def test_get_timeout(self):
queue = queues.create()
queue = queues.create_shared()
with self.assertRaises(queues.QueueEmpty):
queue.get(timeout=0.1)

def test_get_nowait(self):
queue = queues.create()
queue = queues.create_shared()
with self.assertRaises(queues.QueueEmpty):
queue.get_nowait()

def test_put_get_same_interpreter(self):
interp = interpreters.create()
interp.exec_sync(dedent("""
from test.support.interpreters import queues
queue = queues.create()
queue = queues.create_shared()
orig = b'spam'
queue.put(orig)
obj = queue.get()
Expand All @@ -214,8 +214,8 @@ def test_put_get_same_interpreter(self):

def test_put_get_different_interpreters(self):
interp = interpreters.create()
queue1 = queues.create()
queue2 = queues.create()
queue1 = queues.create_shared()
queue2 = queues.create_shared()
self.assertEqual(len(queues.list_all()), 2)

obj1 = b'spam'
Expand All @@ -225,8 +225,8 @@ def test_put_get_different_interpreters(self):
interp,
dedent(f"""
from test.support.interpreters import queues
queue1 = queues.Queue({queue1.id})
queue2 = queues.Queue({queue2.id})
queue1 = queues.SharedQueue({queue1.id})
queue2 = queues.SharedQueue({queue2.id})
assert queue1.qsize() == 1, 'expected: queue1.qsize() == 1'
obj = queue1.get()
assert queue1.qsize() == 0, 'expected: queue1.qsize() == 0'
Expand All @@ -249,13 +249,13 @@ def test_put_get_different_interpreters(self):

def test_put_cleared_with_subinterpreter(self):
interp = interpreters.create()
queue = queues.create()
queue = queues.create_shared()

out = _run_output(
interp,
dedent(f"""
from test.support.interpreters import queues
queue = queues.Queue({queue.id})
queue = queues.SharedQueue({queue.id})
obj1 = b'spam'
obj2 = b'eggs'
queue.put(obj1)
Expand All @@ -271,8 +271,8 @@ def test_put_cleared_with_subinterpreter(self):
self.assertEqual(queue.qsize(), 0)

def test_put_get_different_threads(self):
queue1 = queues.create()
queue2 = queues.create()
queue1 = queues.create_shared()
queue2 = queues.create_shared()

def f():
while True:
Expand Down