Skip to content

Commit 2cd1ec7

Browse files
ericsnowcurrentlyadorilson
authored andcommitted
pythongh-76785: Fix interpreters.Queue.get_nowait() (pythongh-116166)
I missed this change in pythongh-115566.
1 parent 6b0c1c2 commit 2cd1ec7

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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy