8000 gh-76785: Update test.support.interpreters to Align With PEP 734 by ericsnowcurrently · Pull Request #115566 · python/cpython · GitHub
[go: up one dir, main page]

Skip to content

gh-76785: Update test.support.interpreters to Align With PEP 734 #115566

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 19 commits into from
Feb 28, 2024
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
Revert to a single Queue class.
  • Loading branch information
ericsnowcurrently committed Feb 27, 2024
commit ac66dc04e4695b52024ba0905fe48625cbfd4b55
16 changes: 4 additions & 12 deletions Lib/test/support/interpreters/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,27 +16,19 @@
'Interpreter',
'InterpreterError', 'InterpreterNotFoundError', 'ExecFailure',
'NotShareableError',
'create_shared_queue', 'create_queue',
'SharedQueue', 'Queue',
'QueueEmpty', 'QueueFull',
'create_queue', 'Queue', 'QueueEmpty', 'QueueFull',
]


_queuemod = None

def __getattr__(name):
if name in ('QueueEmpty', 'QueueFull',
'SharedQueue', 'create_shared_queue',
'Queue', 'create_queue'):
global QueueEmpty, QueueFull
global create_shared_queue, SharedQueue
global create_queue, Queue
if name in ('Queue', 'QueueEmpty', 'QueueFull', 'create_queue'):
global create_queue, Queue, QueueEmpty, QueueFull
ns = globals()
from .queues import (
QueueEmpty, QueueFull,
create_shared as create_shared_queue,
create as create_queue,
SharedQueue, Queue,
Queue, QueueEmpty, QueueFull,
)
return ns[name]
else:
Expand Down
42 changes: 6 additions & 36 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_shared', 'create', 'list_all',
'SharedQueue', 'Queue',
'create', 'list_all',
'Queue',
'QueueError', 'QueueNotFoundError', 'QueueEmpty', 'QueueFull',
]

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


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

The queue may be used to pass data safely between interpreters.
Only "shareable" objects put into the queue. The data is handled
with maximum efficiency.
"""
qid = _queues.create(maxsize, sharedonly=True)
return SharedQueue(qid)


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

The queue may be used to pass data safely between interpreters.
Any object may be put into the queue. Each is serialized, and thus
copied. This approach is not as efficient as queues made with
create_shared().
"""
qid = _queues.create(maxsize, sharedonly=False)
qid = _queues.create(maxsize)
return Queue(qid)


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



_known_queues = weakref.WeakValueDictionary()

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

def __new__(cls, id, /):
Expand Down Expand Up @@ -123,8 +109,6 @@ def put(self, obj, timeout=None, *,
):
"""Add the object to the queue.

The object must be "shareable".

This blocks while the queue is full.
"""
if timeout is not None:
Expand Down Expand Up @@ -185,18 +169,4 @@ def get_nowait(self):
raise # re-raise


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

def put(self, obj, timeout=None):
"""Add the object to the queue.

All objects are supported.

This blocks while the queue is full.
"""
super().put(obj, timeout)


_queues._register_queue_type(SharedQueue)
_queues._register_queue_type(Queue)
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_shared_queue,
interpreters.SharedQueue,
interpreters.create_queue,
interpreters.Queue,
interpreters.QueueEmpty,
interpreters.QueueFull,
]
second = [
interpreters.create_shared_queue,
interpreters.SharedQueue,
interpreters.create_queue,
interpreters.Queue,
interpreters.QueueEmpty,
interpreters.QueueFull,
]
Expand Down
74 changes: 37 additions & 37 deletions Lib/test/test_interpreters/test_queues.py
8F9D
Original file line number Diff line number Diff line change
Expand Up @@ -20,50 +20,50 @@ def tearDown(self):
pass


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

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

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

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

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

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

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

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

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

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

with self.subTest('from current interpreter'):
queue4 = queues.create_shared()
queue4 = queues.create()
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_shared()
queue5 = queues.create()
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_shared()
queue = queues.create()
self.assertIsInstance(queue.id, int)

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

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

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

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

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


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

def test_empty(self):
queue = queues.create_shared()
queue = queues.create()
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_shared(3)
queue = queues.create(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_shared()
queue = queues.create()
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_shared()
queue = queues.create()
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_shared(2)
queue = queues.create(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_shared(2)
queue = queues.create(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_shared()
queue = queues.create()
with self.assertRaises(queues.QueueEmpty):
queue.get(timeout=0.1)

def test_get_nowait(self):
queue = queues.create_shared()
queue = queues.create()
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_shared()
queue = queues.create()
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_shared()
queue2 = queues.create_shared()
queue1 = queues.create()
queue2 = queues.create()
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.SharedQueue({queue1.id})
queue2 = queues.SharedQueue({queue2.id})
queue1 = queues.Queue({queue1.id})
queue2 = queues.Queue({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_shared()
queue = queues.create()

out = _run_output(
interp,
dedent(f"""
from test.support.interpreters import queues
queue = queues.SharedQueue({queue.id})
queue = queues.Queue({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_shared()
queue2 = queues.create_shared()
queue1 = queues.create()
queue2 = queues.create()

def f():
while True:
Expand Down
0