42 lines
1023 B
Python
42 lines
1023 B
Python
"""A thread for a subshell."""
|
|
|
|
import asyncio
|
|
from typing import Any
|
|
|
|
import zmq
|
|
|
|
from .socket_pair import SocketPair
|
|
from .thread import BaseThread
|
|
|
|
|
|
class SubshellThread(BaseThread):
|
|
"""A thread for a subshell.
|
|
|
|
.. versionadded:: 7
|
|
"""
|
|
|
|
def __init__(
|
|
self,
|
|
subshell_id: str,
|
|
context: zmq.Context[Any],
|
|
**kwargs,
|
|
):
|
|
"""Initialize the thread."""
|
|
super().__init__(name=f"subshell-{subshell_id}", **kwargs)
|
|
|
|
self.shell_channel_to_subshell = SocketPair(context, subshell_id)
|
|
self.subshell_to_shell_channel = SocketPair(context, subshell_id + "-reverse")
|
|
|
|
# When aborting flag is set, execute_request messages to this subshell will be aborted.
|
|
self.aborting = False
|
|
|
|
self.asyncio_lock = asyncio.Lock()
|
|
|
|
def run(self) -> None:
|
|
"""Run the thread."""
|
|
try:
|
|
super().run()
|
|
finally:
|
|
self.shell_channel_to_subshell.close()
|
|
self.subshell_to_shell_channel.close()
|