Skip to content

Commit 5d90d9e

Browse files
ianthomas23krassowskiCarreau
authored
Subshells implemented using tornado event loops on 6.x branch (#1396)
Co-authored-by: Michał Krassowski <[email protected]> Co-authored-by: M Bussonnier <[email protected]>
1 parent 7603443 commit 5d90d9e

22 files changed

+1078
-104
lines changed

.github/workflows/ci.yml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,19 +49,19 @@ jobs:
4949
timeout-minutes: 15
5050
if: ${{ !startsWith( matrix.python-version, 'pypy' ) && !startsWith(matrix.os, 'windows') }}
5151
run: |
52-
hatch run cov:test --cov-fail-under 50 || hatch run test:test --lf
52+
hatch run cov:test --cov-fail-under 50
5353
5454
- name: Run the tests on pypy
5555
timeout-minutes: 15
5656
if: ${{ startsWith( matrix.python-version, 'pypy' ) }}
5757
run: |
58-
hatch run test:nowarn || hatch run test:nowarn --lf
58+
hatch run test:nowarn
5959
6060
- name: Run the tests on Windows
6161
timeout-minutes: 15
6262
if: ${{ startsWith(matrix.os, 'windows') }}
6363
run: |
64-
hatch run cov:nowarn || hatch run test:nowarn --lf
64+
hatch run cov:nowarn
6565
6666
- name: Check Launcher
6767
run: |
@@ -144,7 +144,7 @@ jobs:
144144
145145
- name: Run the tests
146146
timeout-minutes: 15
147-
run: pytest -W default -vv || pytest --vv -W default --lf
147+
run: pytest -W default -vv
148148

149149
test_miniumum_versions:
150150
name: Test Minimum Versions
@@ -164,7 +164,7 @@ jobs:
164164
165165
- name: Run the unit tests
166166
run: |
167-
hatch -v run test:nowarn || hatch run test:nowarn --lf
167+
hatch -v run test:nowarn
168168
169169
test_prereleases:
170170
name: Test Prereleases
@@ -179,7 +179,7 @@ jobs:
179179
dependency_type: pre
180180
- name: Run the tests
181181
run: |
182-
hatch run test:nowarn || hatch run test:nowarn --lf
182+
hatch run test:nowarn
183183
184184
make_sdist:
185185
name: Make SDist

.github/workflows/downstream.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ jobs:
104104
shell: bash -l {0}
105105
run: |
106106
cd ${GITHUB_WORKSPACE}/..
107-
git clone https://github.com/jupyter/qtconsole.git
107+
git clone https://github.com/spyder-ide/qtconsole.git
108108
cd qtconsole
109109
${pythonLocation}/bin/python -m pip install -e ".[test]"
110110
${pythonLocation}/bin/python -m pip install pyqt5

.readthedocs.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ version: 2
33
build:
44
os: ubuntu-22.04
55
tools:
6-
python: "3.11"
6+
python: "3.13"
77

88
sphinx:
99
configuration: docs/conf.py

docs/api/ipykernel.comm.rst

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,19 @@ Submodules
77

88
.. automodule:: ipykernel.comm.comm
99
:members:
10-
:show-inheritance:
1110
:undoc-members:
11+
:show-inheritance:
1212

1313

1414
.. automodule:: ipykernel.comm.manager
1515
:members:
16-
:show-inheritance:
1716
:undoc-members:
17+
:show-inheritance:
1818

1919
Module contents
2020
---------------
2121

2222
.. automodule:: ipykernel.comm
2323
:members:
24-
:show-inheritance:
2524
:undoc-members:
25+
:show-inheritance:

docs/api/ipykernel.inprocess.rst

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,49 +7,49 @@ Submodules
77

88
.. automodule:: ipykernel.inprocess.blocking
99
:members:
10-
:show-inheritance:
1110
:undoc-members:
11+
:show-inheritance:
1212

1313

1414
.. automodule:: ipykernel.inprocess.channels
1515
:members:
16-
:show-inheritance:
1716
:undoc-members:
17+
:show-inheritance:
1818

1919

2020
.. automodule:: ipykernel.inprocess.client
2121
:members:
22-
:show-inheritance:
2322
:undoc-members:
23+
:show-inheritance:
2424

2525

2626
.. automodule:: ipykernel.inprocess.constants
2727
:members:
28-
:show-inheritance:
2928
:undoc-members:
29+
:show-inheritance:
3030

3131

3232
.. automodule:: ipykernel.inprocess.ipkernel
3333
:members:
34-
:show-inheritance:
3534
:undoc-members:
35+
:show-inheritance:
3636

3737

3838
.. automodule:: ipykernel.inprocess.manager
3939
:members:
40-
:show-inheritance:
4140
:undoc-members:
41+
:show-inheritance:
4242

4343

4444
.. automodule:: ipykernel.inprocess.socket
4545
:members:
46-
:show-inheritance:
4746
:undoc-members:
47+
:show-inheritance:
4848

4949
Module contents
5050
---------------
5151

5252
.. automodule:: ipykernel.inprocess
5353
:members:
54-
:show-inheritance:
5554
:undoc-members:
55+
:show-inheritance:

docs/api/ipykernel.rst

Lines changed: 48 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -16,115 +16,145 @@ Submodules
1616

1717
.. automodule:: ipykernel.compiler
1818
:members:
19-
:show-inheritance:
2019
:undoc-members:
20+
:show-inheritance:
2121

2222

2323
.. automodule:: ipykernel.connect
2424
:members:
25-
:show-inheritance:
2625
:undoc-members:
26+
:show-inheritance:
2727

2828

2929
.. automodule:: ipykernel.control
3030
:members:
31-
:show-inheritance:
3231
:undoc-members:
32+
:show-inheritance:
3333

3434

3535
.. automodule:: ipykernel.debugger
3636
:members:
37-
:show-inheritance:
3837
:undoc-members:
38+
:show-inheritance:
3939

4040

4141
.. automodule:: ipykernel.displayhook
4242
:members:
43-
:show-inheritance:
4443
:undoc-members:
44+
:show-inheritance:
4545

4646

4747
.. automodule:: ipykernel.embed
4848
:members:
49-
:show-inheritance:
5049
:undoc-members:
50+
:show-inheritance:
5151

5252

5353
.. automodule:: ipykernel.eventloops
5454
:members:
55-
:show-inheritance:
5655
:undoc-members:
56+
:show-inheritance:
5757

5858

5959
.. automodule:: ipykernel.heartbeat
6060
:members:
61-
:show-inheritance:
6261
:undoc-members:
62+
:show-inheritance:
6363

6464

6565
.. automodule:: ipykernel.iostream
6666
:members:
67-
:show-inheritance:
6867
:undoc-members:
68+
:show-inheritance:
6969

7070

7171
.. automodule:: ipykernel.ipkernel
7272
:members:
73-
:show-inheritance:
7473
:undoc-members:
74+
:show-inheritance:
7575

7676

7777
.. automodule:: ipykernel.jsonutil
7878
:members:
79-
:show-inheritance:
8079
:undoc-members:
80+
:show-inheritance:
8181

8282

8383
.. automodule:: ipykernel.kernelapp
8484
:members:
85-
:show-inheritance:
8685
:undoc-members:
86+
:show-inheritance:
8787

8888

8989
.. automodule:: ipykernel.kernelbase
9090
:members:
91-
:show-inheritance:
9291
:undoc-members:
92+
:show-inheritance:
9393

9494

9595
.. automodule:: ipykernel.kernelspec
9696
:members:
97-
:show-inheritance:
9897
:undoc-members:
98+
:show-inheritance:
9999

100100

101101
.. automodule:: ipykernel.log
102102
:members:
103-
:show-inheritance:
104103
:undoc-members:
104+
:show-inheritance:
105105

106106

107107
.. automodule:: ipykernel.parentpoller
108108
:members:
109+
:undoc-members:
109110
:show-inheritance:
111+
112+
113+
.. automodule:: ipykernel.shellchannel
114+
:members:
110115
:undoc-members:
116+
:show-inheritance:
111117

112118

113-
.. automodule:: ipykernel.trio_runner
119+
.. automodule:: ipykernel.socket_pair
114120
:members:
121+
:undoc-members:
115122
:show-inheritance:
123+
124+
125+
.. automodule:: ipykernel.subshell
126+
:members:
116127
:undoc-members:
128+
:show-inheritance:
117129

118130

119-
.. automodule:: ipykernel.zmqshell
131+
.. automodule:: ipykernel.subshell_manager
132+
:members:
133+
:undoc-members:
134+
:show-inheritance:
135+
136+
137+
.. automodule:: ipykernel.thread
120138
:members:
139+
:undoc-members:
121140
:show-inheritance:
141+
142+
143+
.. automodule:: ipykernel.trio_runner
144+
:members:
122145
:undoc-members:
146+
:show-inheritance:
147+
148+
149+
.. automodule:: ipykernel.zmqshell
150+
:members:
151+
:undoc-members:
152+
:show-inheritance:
123153

124154
Module contents
125155
---------------
126156

127157
.. automodule:: ipykernel
128158
:members:
129-
:show-inheritance:
130159
:undoc-members:
160+
:show-inheritance:

ipykernel/control.py

Lines changed: 3 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,11 @@
11
"""A thread for a control channel."""
2-
from threading import Thread
32

4-
from tornado.ioloop import IOLoop
3+
from .thread import CONTROL_THREAD_NAME, BaseThread
54

6-
CONTROL_THREAD_NAME = "Control"
75

8-
9-
class ControlThread(Thread):
6+
class ControlThread(BaseThread):
107
"""A thread for a control channel."""
118

129
def __init__(self, **kwargs):
1310
"""Initialize the thread."""
14-
Thread.__init__(self, name=CONTROL_THREAD_NAME, **kwargs)
15-
self.io_loop = IOLoop(make_current=False)
16-
self.pydev_do_not_trace = True
17-
self.is_pydev_daemon_thread = True
18-
19-
def run(self):
20-
"""Run the thread."""
21-
self.name = CONTROL_THREAD_NAME
22-
try:
23-
self.io_loop.start()
24-
finally:
25-
self.io_loop.close()
26-
27-
def stop(self):
28-
"""Stop the thread.
29-
30-
This method is threadsafe.
31-
"""
32-
self.io_loop.add_callback(self.io_loop.stop)
11+
super().__init__(name=CONTROL_THREAD_NAME, **kwargs)

ipykernel/ipkernel.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,11 @@ def set_sigint_result():
361361
# restore the previous sigint handler
362362
signal.signal(signal.SIGINT, save_sigint)
363363

364+
@contextmanager
365+
def _dummy_context_manager(self, *args):
366+
# Signals only work in main thread, so cannot use _cancel_on_sigint in subshells.
367+
yield
368+
364369
async def execute_request(self, stream, ident, parent):
365370
"""Override for cell output - cell reconciliation."""
366371
parent_header = extract_header(parent)
@@ -439,7 +444,12 @@ async def run_cell(*args, **kwargs):
439444

440445
coro_future = asyncio.ensure_future(coro)
441446

442-
with self._cancel_on_sigint(coro_future):
447+
cm = (
448+
self._cancel_on_sigint
449+
if threading.current_thread() == threading.main_thread()
450+
else self._dummy_context_manager
451+
)
452+
with cm(coro_future): # type:ignore[operator]
443453
res = None
444454
try:
445455
res = await coro_future

0 commit comments

Comments
 (0)