mirror of
https://github.com/python/cpython.git
synced 2025-07-22 02:35:22 +00:00

* PEP 554 for use in test suite * 📜🤖 Added by blurb_it. * Fix space * Add doc to doc tree * Move to modules doc tree * Fix suspicious doc errors * Fix test__all * Docs docs docs * Support isolated and fix wait * Fix white space * Remove undefined from __all__ * Fix recv and add exceptions * Remove unused exceptions, fix pep 8 formatting errors and fix _NOT_SET in recv_nowait() Co-authored-by: nanjekyejoannah <joannah.nanjekye@ibm.com> Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com>
183 lines
4.2 KiB
Python
183 lines
4.2 KiB
Python
"""Subinterpreters High Level Module."""
|
|
|
|
import _xxsubinterpreters as _interpreters
|
|
|
|
# aliases:
|
|
from _xxsubinterpreters import (
|
|
ChannelError, ChannelNotFoundError, ChannelEmptyError,
|
|
is_shareable,
|
|
)
|
|
|
|
|
|
__all__ = [
|
|
'Interpreter', 'get_current', 'get_main', 'create', 'list_all',
|
|
'SendChannel', 'RecvChannel',
|
|
'create_channel', 'list_all_channels', 'is_shareable',
|
|
'ChannelError', 'ChannelNotFoundError',
|
|
'ChannelEmptyError',
|
|
]
|
|
|
|
|
|
def create(*, isolated=True):
|
|
"""
|
|
Initialize a new (idle) Python interpreter.
|
|
"""
|
|
id = _interpreters.create(isolated=isolated)
|
|
return Interpreter(id, isolated=isolated)
|
|
|
|
|
|
def list_all():
|
|
"""
|
|
Get all existing interpreters.
|
|
"""
|
|
return [Interpreter(id) for id in
|
|
_interpreters.list_all()]
|
|
|
|
|
|
def get_current():
|
|
"""
|
|
Get the currently running interpreter.
|
|
"""
|
|
id = _interpreters.get_current()
|
|
return Interpreter(id)
|
|
|
|
|
|
def get_main():
|
|
"""
|
|
Get the main interpreter.
|
|
"""
|
|
id = _interpreters.get_main()
|
|
return Interpreter(id)
|
|
|
|
|
|
class Interpreter:
|
|
"""
|
|
The Interpreter object represents
|
|
a single interpreter.
|
|
"""
|
|
|
|
def __init__(self, id, *, isolated=None):
|
|
self._id = id
|
|
self._isolated = isolated
|
|
|
|
@property
|
|
def id(self):
|
|
return self._id
|
|
|
|
@property
|
|
def isolated(self):
|
|
if self._isolated is None:
|
|
self._isolated = _interpreters.is_isolated(self._id)
|
|
return self._isolated
|
|
|
|
def is_running(self):
|
|
"""
|
|
Return whether or not the identified
|
|
interpreter is running.
|
|
"""
|
|
return _interpreters.is_running(self._id)
|
|
|
|
def close(self):
|
|
"""
|
|
Finalize and destroy the interpreter.
|
|
|
|
Attempting to destroy the current
|
|
interpreter results in a RuntimeError.
|
|
"""
|
|
return _interpreters.destroy(self._id)
|
|
|
|
def run(self, src_str, /, *, channels=None):
|
|
"""
|
|
Run the given source code in the interpreter.
|
|
This blocks the current Python thread until done.
|
|
"""
|
|
_interpreters.run_string(self._id, src_str)
|
|
|
|
|
|
def create_channel():
|
|
"""
|
|
Create a new channel for passing data between
|
|
interpreters.
|
|
"""
|
|
|
|
cid = _interpreters.channel_create()
|
|
return (RecvChannel(cid), SendChannel(cid))
|
|
|
|
|
|
def list_all_channels():
|
|
"""
|
|
Get all open channels.
|
|
"""
|
|
return [(RecvChannel(cid), SendChannel(cid))
|
|
for cid in _interpreters.channel_list_all()]
|
|
|
|
|
|
_NOT_SET = object()
|
|
|
|
|
|
class RecvChannel:
|
|
"""
|
|
The RecvChannel object represents
|
|
a recieving channel.
|
|
"""
|
|
|
|
def __init__(self, id):
|
|
self._id = id
|
|
|
|
def recv(self, *, _delay=10 / 1000): # 10 milliseconds
|
|
"""
|
|
Get the next object from the channel,
|
|
and wait if none have been sent.
|
|
Associate the interpreter with the channel.
|
|
"""
|
|
import time
|
|
sentinel = object()
|
|
obj = _interpreters.channel_recv(self._id, sentinel)
|
|
while obj is sentinel:
|
|
time.sleep(_delay)
|
|
obj = _interpreters.channel_recv(self._id, sentinel)
|
|
return obj
|
|
|
|
def recv_nowait(self, default=_NOT_SET):
|
|
"""
|
|
Like recv(), but return the default
|
|
instead of waiting.
|
|
|
|
This function is blocked by a missing low-level
|
|
implementation of channel_recv_wait().
|
|
"""
|
|
if default is _NOT_SET:
|
|
return _interpreters.channel_recv(self._id)
|
|
else:
|
|
return _interpreters.channel_recv(self._id, default)
|
|
|
|
|
|
class SendChannel:
|
|
"""
|
|
The SendChannel object represents
|
|
a sending channel.
|
|
"""
|
|
|
|
def __init__(self, id):
|
|
self._id = id
|
|
|
|
def send(self, obj):
|
|
"""
|
|
Send the object (i.e. its data) to the receiving
|
|
end of the channel and wait. Associate the interpreter
|
|
with the channel.
|
|
"""
|
|
import time
|
|
_interpreters.channel_send(self._id, obj)
|
|
time.sleep(2)
|
|
|
|
def send_nowait(self, obj):
|
|
"""
|
|
Like send(), but return False if not received.
|
|
|
|
This function is blocked by a missing low-level
|
|
implementation of channel_send_wait().
|
|
"""
|
|
|
|
_interpreters.channel_send(self._id, obj)
|
|
return False
|