Skip to content

Commit 049aa3a

Browse files
Fix recv and add exceptions
1 parent 90ec54b commit 049aa3a

File tree

2 files changed

+21
-30
lines changed

2 files changed

+21
-30
lines changed

Lib/test/support/interpreters.py

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,26 @@
11
"""Subinterpreters High Level Module."""
22

33
import _xxsubinterpreters as _interpreters
4+
# aliases:
5+
from _xxsubinterpreters import (
6+
ChannelError, ChannelNotFoundError,
7+
ChannelEmptyError, ChannelNotEmptyError, NotReceivedError,
8+
is_shareable,
9+
)
410

511
__all__ = [
612
'Interpreter', 'get_current', 'get_main', 'create', 'list_all',
713
'SendChannel', 'RecvChannel',
814
'create_channel', 'list_all_channels', 'is_shareable',
15+
'ChannelError', 'ChannelNotFoundError',
16+
'ChannelEmptyError', 'ChannelNotEmptyError',
17+
'NotReceivedError',
918
]
1019

1120

1221
def create(*, isolated=True):
1322
"""
1423
Initialize a new (idle) Python interpreter.
15-
1624
"""
1725
id = _interpreters.create(isolated=isolated)
1826
return Interpreter(id, isolated=isolated)
@@ -80,19 +88,9 @@ def run(self, src_str, /, *, channels=None):
8088
Run the given source code in the interpreter.
8189
This blocks the current Python thread until done.
8290
"""
83-
try:
84-
_interpreters.run_string(self._id, src_str)
85-
except _interpreters.RunFailedError as err:
86-
raise
91+
_interpreters.run_string(self._id, src_str)
8792

8893

89-
def is_shareable(obj):
90-
"""
91-
Return `True` if the object's data can be
92-
shared between interpreters and `False` otherwise.
93-
"""
94-
return _interpreters.is_shareable(obj)
95-
9694
def create_channel():
9795
"""
9896
Create a new channel for passing data between
@@ -119,8 +117,8 @@ class RecvChannel:
119117
def __init__(self, id):
120118
self._id = id
121119

122-
def recv(self, *, _delay=10 / 1000): # seconds
123-
""" channel_recv() -> obj
120+
def recv(self, *, _delay=10 / 1000): # 10 milliseconds
121+
"""
124122
Get the next object from the channel,
125123
and wait if none have been sent.
126124
Associate the interpreter with the channel.
@@ -133,19 +131,22 @@ def recv(self, *, _delay=10 / 1000): # seconds
133131
obj = _interpreters.channel_recv(self._id, sentinel)
134132
return obj
135133

136-
_NOT_SET = object()
137-
138134
def recv_nowait(self, default=None):
139135
"""
140136
Like recv(), but return the default
141137
instead of waiting.
142-
"""
143138
139+
This function is blocked by a missing low-level
140+
implementation of channel_recv_wait().
141+
"""
144142
if default is None:
143+
default = _NOT_SET
144+
if default is _NOT_SET:
145145
return _interpreters.channel_recv(self._id)
146146
else:
147147
return _interpreters.channel_recv(self._id, default)
148148

149+
_NOT_SET = object()
149150

150151
class SendChannel:
151152
"""
@@ -169,6 +170,9 @@ def send(self, obj):
169170
def send_nowait(self, obj):
170171
"""
171172
Like send(), but return False if not received.
173+
174+
This function is blocked by a missing low-level
175+
implementation of channel_send_wait().
172176
"""
173177

174178
_interpreters.channel_send(self._id, obj)

Lib/test/test_interpreters.py

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -530,16 +530,3 @@ def f():
530530
except _interpreters.ChannelEmptyError:
531531
time.sleep(0.1)
532532
s.send(obj)
533-
t = threading.Thread(target=f)
534-
t.start()
535-
536-
s.send(b'spam')
537-
t.join()
538-
obj = r.recv_nowait()
539-
540-
self.assertEqual(obj, b'spam')
541-
542-
def test_recv_nowait_empty(self):
543-
r, s = interpreters.create_channel()
544-
with self.assertRaises(_interpreters.ChannelEmptyError):
545-
r.recv_nowait()

0 commit comments

Comments
 (0)