Skip to content

Commit 936d461

Browse files
gh-76785: Fix interpreters.Queue.get_nowait() (gh-116166)
I missed this change in gh-115566.
1 parent a7549b0 commit 936d461

File tree

2 files changed

+75
-48
lines changed

2 files changed

+75
-48
lines changed

Lib/test/support/interpreters/queues.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,10 +215,15 @@ def get_nowait(self):
215215
is the same as get().
216216
"""
217217
try:
218-
return _queues.get(self._id)
218+
obj, fmt = _queues.get(self._id)
219219
except _queues.QueueEmpty as exc:
220220
exc.__class__ = QueueEmpty
221221
raise # re-raise
222+
if fmt == _PICKLED:
223+
obj = pickle.loads(obj)
224+
else:
225+
assert fmt == _SHARED_ONLY
226+
return obj
222227

223228

224229
_queues._register_queue_type(Queue)

Lib/test/test_interpreters/test_queues.py

Lines changed: 69 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -210,10 +210,15 @@ def test_put_syncobj(self):
210210
]:
211211
with self.subTest(repr(obj)):
212212
queue = queues.create()
213+
213214
queue.put(obj, syncobj=True)
214215
obj2 = queue.get()
215216
self.assertEqual(obj2, obj)
216217

218+
queue.put(obj, syncobj=True)
219+
obj2 = queue.get_nowait()
220+
self.assertEqual(obj2, obj)
221+
217222
for obj in [
218223
[1, 2, 3],
219224
{'a': 13, 'b': 17},
@@ -237,10 +242,15 @@ def test_put_not_syncobj(self):
237242
]:
238243
with self.subTest(repr(obj)):
239244
queue = queues.create()
245+
240246
queue.put(obj, syncobj=False)
241247
obj2 = queue.get()
242248
self.assertEqual(obj2, obj)
243249

250+
queue.put(obj, syncobj=False)
251+
obj2 = queue.get_nowait()
252+
self.assertEqual(obj2, obj)
253+
244254
def test_get_timeout(self):
245255
queue = queues.create()
246256
with self.assertRaises(queues.QueueEmpty):
@@ -254,11 +264,13 @@ def test_get_nowait(self):
254264
def test_put_get_default_syncobj(self):
255265
expected = list(range(20))
256266
queue = queues.create(syncobj=True)
257-
for i in range(20):
258-
queue.put(i)
259-
actual = [queue.get() for _ in range(20)]
260-
261-
self.assertEqual(actual, expected)
267+
for methname in ('get', 'get_nowait'):
268+
with self.subTest(f'{methname}()'):
269+
get = getattr(queue, methname)
270+
for i in range(20):
271+
queue.put(i)
272+
actual = [get() for _ in range(20)]
273+
self.assertEqual(actual, expected)
262274

263275
obj = [1, 2, 3] # lists are not shareable
264276
with self.assertRaises(interpreters.NotShareableError):
@@ -267,64 +279,74 @@ def test_put_get_default_syncobj(self):
267279
def test_put_get_default_not_syncobj(self):
268280
expected = list(range(20))
269281
queue = queues.create(syncobj=False)
270-
for i in range(20):
271-
queue.put(i)
272-
actual = [queue.get() for _ in range(20)]
282+
for methname in ('get', 'get_nowait'):
283+
with self.subTest(f'{methname}()'):
284+
get = getattr(queue, methname)
273285

274-
self.assertEqual(actual, expected)
286+
for i in range(20):
287+
queue.put(i)
288+
actual = [get() for _ in range(20)]
289+
self.assertEqual(actual, expected)
275290

276-
obj = [1, 2, 3] # lists are not shareable
277-
queue.put(obj)
278-
obj2 = queue.get()
279-
self.assertEqual(obj, obj2)
280-
self.assertIsNot(obj, obj2)
291+
obj = [1, 2, 3] # lists are not shareable
292+
queue.put(obj)
293+
obj2 = get()
294+
self.assertEqual(obj, obj2)
295+
self.assertIsNot(obj, obj2)
281296

282297
def test_put_get_same_interpreter(self):
283298
interp = interpreters.create()
284299
interp.exec(dedent("""
285300
from test.support.interpreters import queues
286301
queue = queues.create()
287-
orig = b'spam'
288-
queue.put(orig, syncobj=True)
289-
obj = queue.get()
290-
assert obj == orig, 'expected: obj == orig'
291-
assert obj is not orig, 'expected: obj is not orig'
292302
"""))
303+
for methname in ('get', 'get_nowait'):
304+
with self.subTest(f'{methname}()'):
305+
interp.exec(dedent(f"""
306+
orig = b'spam'
307+
queue.put(orig, syncobj=True)
308+
obj = queue.{methname}()
309+
assert obj == orig, 'expected: obj == orig'
310+
assert obj is not orig, 'expected: obj is not orig'
311+
"""))
293312

294313
def test_put_get_different_interpreters(self):
295314
interp = interpreters.create()
296315
queue1 = queues.create()
297316
queue2 = queues.create()
298317
self.assertEqual(len(queues.list_all()), 2)
299318

300-
obj1 = b'spam'
301-
queue1.put(obj1, syncobj=True)
302-
303-
out = _run_output(
304-
interp,
305-
dedent(f"""
306-
from test.support.interpreters import queues
307-
queue1 = queues.Queue({queue1.id})
308-
queue2 = queues.Queue({queue2.id})
309-
assert queue1.qsize() == 1, 'expected: queue1.qsize() == 1'
310-
obj = queue1.get()
311-
assert queue1.qsize() == 0, 'expected: queue1.qsize() == 0'
312-
assert obj == b'spam', 'expected: obj == obj1'
313-
# When going to another interpreter we get a copy.
314-
assert id(obj) != {id(obj1)}, 'expected: obj is not obj1'
315-
obj2 = b'eggs'
316-
print(id(obj2))
317-
assert queue2.qsize() == 0, 'expected: queue2.qsize() == 0'
318-
queue2.put(obj2, syncobj=True)
319-
assert queue2.qsize() == 1, 'expected: queue2.qsize() == 1'
320-
"""))
321-
self.assertEqual(len(queues.list_all()), 2)
322-
self.assertEqual(queue1.qsize(), 0)
323-
self.assertEqual(queue2.qsize(), 1)
324-
325-
obj2 = queue2.get()
326-
self.assertEqual(obj2, b'eggs')
327-
self.assertNotEqual(id(obj2), int(out))
319+
for methname in ('get', 'get_nowait'):
320+
with self.subTest(f'{methname}()'):
321+
obj1 = b'spam'
322+
queue1.put(obj1, syncobj=True)
323+
324+
out = _run_output(
325+
interp,
326+
dedent(f"""
327+
from test.support.interpreters import queues
328+
queue1 = queues.Queue({queue1.id})
329+
queue2 = queues.Queue({queue2.id})
330+
assert queue1.qsize() == 1, 'expected: queue1.qsize() == 1'
331+
obj = queue1.{methname}()
332+
assert queue1.qsize() == 0, 'expected: queue1.qsize() == 0'
333+
assert obj == b'spam', 'expected: obj == obj1'
334+
# When going to another interpreter we get a copy.
335+
assert id(obj) != {id(obj1)}, 'expected: obj is not obj1'
336+
obj2 = b'eggs'
337+
print(id(obj2))
338+
assert queue2.qsize() == 0, 'expected: queue2.qsize() == 0'
339+
queue2.put(obj2, syncobj=True)
340+
assert queue2.qsize() == 1, 'expected: queue2.qsize() == 1'
341+
"""))
342+
self.assertEqual(len(queues.list_all()), 2)
343+
self.assertEqual(queue1.qsize(), 0)
344+
self.assertEqual(queue2.qsize(), 1)
345+
346+
get = getattr(queue2, methname)
347+
obj2 = get()
348+
self.assertEqual(obj2, b'eggs')
349+
self.assertNotEqual(id(obj2), int(out))
328350

329351
def test_put_cleared_with_subinterpreter(self):
330352
interp = interpreters.create()

0 commit comments

Comments
 (0)