async-kernel 0.17.0__tar.gz → 0.18.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {async_kernel-0.17.0 → async_kernel-0.18.0}/.github/workflows/ci.yml +2 -2
- {async_kernel-0.17.0 → async_kernel-0.18.0}/.github/workflows/publish-docs.yml +1 -1
- {async_kernel-0.17.0 → async_kernel-0.18.0}/.pre-commit-config.yaml +4 -4
- {async_kernel-0.17.0 → async_kernel-0.18.0}/.vscode/launch.json +1 -1
- {async_kernel-0.17.0 → async_kernel-0.18.0}/CHANGELOG.md +57 -1
- {async_kernel-0.17.0 → async_kernel-0.18.0}/CONTRIBUTING.md +4 -8
- {async_kernel-0.17.0 → async_kernel-0.18.0}/PKG-INFO +1 -1
- {async_kernel-0.17.0 → async_kernel-0.18.0}/_version.py +2 -2
- {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/notebooks/caller.ipynb +1 -1
- {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/notebooks/concurrency.ipynb +157 -7
- {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/notebooks/custom_kernel.ipynb +9 -7
- {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/__init__.py +2 -1
- {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/asyncshell.py +110 -119
- {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/caller.py +63 -57
- {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/interface/base.py +161 -165
- {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/interface/callable.py +2 -2
- {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/interface/zmq.py +3 -3
- {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/iostream.py +11 -4
- {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/kernel.py +72 -12
- {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/kernelspec.py +1 -1
- {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/typing.py +42 -24
- {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/utils.py +40 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/tests/test_iostream.py +1 -1
- {async_kernel-0.17.0 → async_kernel-0.18.0}/tests/test_kernel.py +55 -33
- {async_kernel-0.17.0 → async_kernel-0.18.0}/tests/test_typing.py +3 -3
- {async_kernel-0.17.0 → async_kernel-0.18.0}/tests/test_utils.py +3 -1
- {async_kernel-0.17.0 → async_kernel-0.18.0}/uv.lock +75 -80
- {async_kernel-0.17.0 → async_kernel-0.18.0}/.github/dependabot.yaml +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/.github/release.yml +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/.github/workflows/enforce-label.yml +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/.github/workflows/new_release.yml +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/.github/workflows/pre-commit.yml +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/.github/workflows/publish-to-pypi.yml +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/.gitignore +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/.vscode/settings.json +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/.vscode/spellright.dict +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/IPYTHON_LICENSE +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/LICENSE +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/README.md +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/cliff.toml +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/about/changelog.md +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/about/contributing.md +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/about/index.md +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/about/license.md +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/index.md +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/javascripts/extra.js +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/overrides/main.html +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/reference/asyncshell.md +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/reference/caller.md +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/reference/comm.md +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/reference/command.md +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/reference/common.md +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/reference/debugger.md +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/reference/event_loop.md +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/reference/index.md +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/reference/interface.md +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/reference/kernel.md +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/reference/kernelspec.md +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/reference/pending.md +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/reference/typing.md +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/reference/utils.md +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/stylesheets/extra.css +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/thread_safety.md +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/usage/commands.md +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/docs/usage/index.md +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/hatch_build.py +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/mkdocs.yml +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/pyproject.toml +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/__main__.py +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/comm.py +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/command.py +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/common.py +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/compat/json.py +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/compiler.py +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/debugger.py +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/event_loop/__init__.py +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/event_loop/asyncio_guest.py +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/event_loop/qt_host.py +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/event_loop/run.py +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/event_loop/tk_host.py +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/interface/__init__.py +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/pending.py +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/py.typed +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/resources/logo-32x32.png +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/resources/logo-64x64.png +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/src/async_kernel/resources/logo-svg.svg +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/tests/__init__.py +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/tests/conftest.py +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/tests/references.py +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/tests/test_callable_kernel_interface.py +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/tests/test_caller.py +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/tests/test_comm.py +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/tests/test_command.py +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/tests/test_common.py +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/tests/test_compat.py +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/tests/test_debugger.py +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/tests/test_enter_kernel.py +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/tests/test_event_loop.py +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/tests/test_kernel_subclass.py +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/tests/test_kernelspec.py +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/tests/test_message_spec.py +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/tests/test_pending.py +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/tests/test_zmq_messaging.py +0 -0
- {async_kernel-0.17.0 → async_kernel-0.18.0}/tests/utils.py +0 -0
|
@@ -25,7 +25,7 @@ jobs:
|
|
|
25
25
|
- name: Type checking with basedpyright
|
|
26
26
|
run: |
|
|
27
27
|
uv sync
|
|
28
|
-
uvx basedpyright@1.39.
|
|
28
|
+
uvx basedpyright@1.39.3
|
|
29
29
|
|
|
30
30
|
test:
|
|
31
31
|
needs: type-checking
|
|
@@ -110,5 +110,5 @@ jobs:
|
|
|
110
110
|
timeout-minutes: 5
|
|
111
111
|
run: |
|
|
112
112
|
uv sync --group docs
|
|
113
|
-
uv run async-kernel -a async-docs --shell.timeout=
|
|
113
|
+
uv run async-kernel -a async-docs --shell.timeout=1
|
|
114
114
|
uv run mkdocs build -s
|
|
@@ -40,7 +40,7 @@ jobs:
|
|
|
40
40
|
- name: Install the project
|
|
41
41
|
run: |
|
|
42
42
|
uv sync --group docs
|
|
43
|
-
uv run async-kernel -a async-docs --shell.timeout=
|
|
43
|
+
uv run async-kernel -a async-docs --shell.timeout=1 # The 'async-docs' kernel is specified as the kernel for mkdocs-jupyter
|
|
44
44
|
|
|
45
45
|
- name: Version info
|
|
46
46
|
id: version
|
|
@@ -28,12 +28,12 @@ repos:
|
|
|
28
28
|
- id: check-json5
|
|
29
29
|
|
|
30
30
|
- repo: https://github.com/python-jsonschema/check-jsonschema
|
|
31
|
-
rev: 0.37.
|
|
31
|
+
rev: 0.37.1
|
|
32
32
|
hooks:
|
|
33
33
|
- id: check-github-workflows
|
|
34
34
|
|
|
35
35
|
- repo: https://github.com/rbubley/mirrors-prettier
|
|
36
|
-
rev: v3.8.
|
|
36
|
+
rev: v3.8.3
|
|
37
37
|
hooks:
|
|
38
38
|
- id: prettier
|
|
39
39
|
types_or: [yaml, html, json]
|
|
@@ -59,7 +59,7 @@ repos:
|
|
|
59
59
|
- id: python-use-type-annotations
|
|
60
60
|
|
|
61
61
|
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
62
|
-
rev: v0.15.
|
|
62
|
+
rev: v0.15.11
|
|
63
63
|
hooks:
|
|
64
64
|
- id: ruff-check
|
|
65
65
|
types_or: [python, jupyter]
|
|
@@ -68,7 +68,7 @@ repos:
|
|
|
68
68
|
types_or: [python, jupyter]
|
|
69
69
|
|
|
70
70
|
- repo: https://github.com/scientific-python/cookie
|
|
71
|
-
rev: 2026.
|
|
71
|
+
rev: 2026.04.04
|
|
72
72
|
hooks:
|
|
73
73
|
- id: sp-repo-review
|
|
74
74
|
additional_dependencies: ["repo-review[cli]"]
|
|
@@ -5,7 +5,57 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
-
## [0.
|
|
8
|
+
## [0.18.0] - 2026-04-25
|
|
9
|
+
|
|
10
|
+
### <!-- 0 --> 🏗️ Breaking changes
|
|
11
|
+
|
|
12
|
+
- Move kernel_info, help_links and debugger from the shell to the kernel or interface. [#444](https://github.com/fleming79/async-kernel/pull/444)
|
|
13
|
+
|
|
14
|
+
### <!-- 1 --> 🚀 Features
|
|
15
|
+
|
|
16
|
+
- Add utils.redirect_stdout and utils.redirect_stderr. [#442](https://github.com/fleming79/async-kernel/pull/442)
|
|
17
|
+
|
|
18
|
+
- Make system calls asynchronous and convert uv and pip magics to use it. [#441](https://github.com/fleming79/async-kernel/pull/441)
|
|
19
|
+
|
|
20
|
+
### <!-- 2 --> 🐛 Fixes
|
|
21
|
+
|
|
22
|
+
- Improve uv support and fix example kernel spec [#440](https://github.com/fleming79/async-kernel/pull/440)
|
|
23
|
+
|
|
24
|
+
### <!-- 5 --> 📝 Documentation
|
|
25
|
+
|
|
26
|
+
- Update Caller docstrings [#446](https://github.com/fleming79/async-kernel/pull/446)
|
|
27
|
+
|
|
28
|
+
### <!-- 6 --> 🌀 Miscellaneous
|
|
29
|
+
|
|
30
|
+
- Refactor AsyncInteractiveShell.shell method [#448](https://github.com/fleming79/async-kernel/pull/448)
|
|
31
|
+
|
|
32
|
+
- Refactor Caller.as_completed. [#447](https://github.com/fleming79/async-kernel/pull/447)
|
|
33
|
+
|
|
34
|
+
- Change kernel_info back to a property. [#445](https://github.com/fleming79/async-kernel/pull/445)
|
|
35
|
+
|
|
36
|
+
- Change magics thread, asynio and trio back to coroutines that don't return results. [#443](https://github.com/fleming79/async-kernel/pull/443)
|
|
37
|
+
|
|
38
|
+
## [0.17.1] - 2026-04-23
|
|
39
|
+
|
|
40
|
+
### <!-- 0 --> 🏗️ Breaking changes
|
|
41
|
+
|
|
42
|
+
- Drop the tag 'suppress_error'. [#436](https://github.com/fleming79/async-kernel/pull/436)
|
|
43
|
+
|
|
44
|
+
- BaseKernelInterface refactoring [#434](https://github.com/fleming79/async-kernel/pull/434)
|
|
45
|
+
|
|
46
|
+
### <!-- 1 --> 🚀 Features
|
|
47
|
+
|
|
48
|
+
- Add asyncio and trio cell and line magic [#437](https://github.com/fleming79/async-kernel/pull/437)
|
|
49
|
+
|
|
50
|
+
- Support specifing the thread with cell magic and passing thread options [#435](https://github.com/fleming79/async-kernel/pull/435)
|
|
51
|
+
|
|
52
|
+
### <!-- 6 --> 🌀 Miscellaneous
|
|
53
|
+
|
|
54
|
+
- Prepare for release v0.17.1 [#439](https://github.com/fleming79/async-kernel/pull/439)
|
|
55
|
+
|
|
56
|
+
- Update pre-commit, uv.lock and basedpyright [#438](https://github.com/fleming79/async-kernel/pull/438)
|
|
57
|
+
|
|
58
|
+
## [0.17.0] - 2026-04-22
|
|
9
59
|
|
|
10
60
|
### <!-- 0 --> 🏗️ Breaking changes
|
|
11
61
|
|
|
@@ -15,6 +65,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
15
65
|
|
|
16
66
|
- Make AsyncInteractiveShell and AsyncInteractiveSubshell easier to subclass. [#430](https://github.com/fleming79/async-kernel/pull/430)
|
|
17
67
|
|
|
68
|
+
### <!-- 6 --> 🌀 Miscellaneous
|
|
69
|
+
|
|
70
|
+
- Prepare for release v0.17.0 [#433](https://github.com/fleming79/async-kernel/pull/433)
|
|
71
|
+
|
|
18
72
|
## [0.16.4] - 2026-04-15
|
|
19
73
|
|
|
20
74
|
### <!-- 2 --> 🐛 Fixes
|
|
@@ -1197,6 +1251,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
1197
1251
|
|
|
1198
1252
|
- Bump the actions group across 1 directory with 2 updates [#3](https://github.com/fleming79/async-kernel/pull/3)
|
|
1199
1253
|
|
|
1254
|
+
[0.18.0]: https://github.com/fleming79/async-kernel/compare/v0.17.1..v0.18.0
|
|
1255
|
+
[0.17.1]: https://github.com/fleming79/async-kernel/compare/v0.17.0..v0.17.1
|
|
1200
1256
|
[0.17.0]: https://github.com/fleming79/async-kernel/compare/v0.16.4..v0.17.0
|
|
1201
1257
|
[0.16.4]: https://github.com/fleming79/async-kernel/compare/v0.16.3..v0.16.4
|
|
1202
1258
|
[0.16.3]: https://github.com/fleming79/async-kernel/compare/v0.16.2..v0.16.3
|
|
@@ -25,7 +25,7 @@ Additional steps to build documentation (optional):
|
|
|
25
25
|
|
|
26
26
|
```bash
|
|
27
27
|
uv sync --group docs
|
|
28
|
-
uv run async-kernel -a async-docs --main_shell.timeout=
|
|
28
|
+
uv run async-kernel -a async-docs --main_shell.timeout=1
|
|
29
29
|
```
|
|
30
30
|
|
|
31
31
|
### Running tests
|
|
@@ -100,7 +100,7 @@ The 'docs' group specified extra packages are required to build documentation.
|
|
|
100
100
|
|
|
101
101
|
```bash
|
|
102
102
|
uv sync --group docs
|
|
103
|
-
uv run async-kernel -a async-docs --main_shell.timeout=
|
|
103
|
+
uv run async-kernel -a async-docs --main_shell.timeout=1
|
|
104
104
|
```
|
|
105
105
|
|
|
106
106
|
#### Test the docs
|
|
@@ -114,7 +114,7 @@ uv run mkdocs build -s
|
|
|
114
114
|
The command:
|
|
115
115
|
|
|
116
116
|
```bash
|
|
117
|
-
uv run async-kernel -a async-docs --main_shell.timeout=
|
|
117
|
+
uv run async-kernel -a async-docs --main_shell.timeout=1
|
|
118
118
|
```
|
|
119
119
|
|
|
120
120
|
Defines a new kernel spec with the name "async-docs" that sets the `shell.timeout` to 100ms.
|
|
@@ -145,13 +145,9 @@ Notebooks are included in the documentation by the plugin [mkdocs-jupyter](https
|
|
|
145
145
|
|
|
146
146
|
!!! info
|
|
147
147
|
|
|
148
|
-
We use the kernel spec named 'async-docs' which has a cell execute timeout of
|
|
148
|
+
We use the kernel spec named 'async-docs' which has a cell execute timeout of 1s. This is used
|
|
149
149
|
to advance execution through long running cells.
|
|
150
150
|
|
|
151
|
-
The [suppress-error][async_kernel.typing.Tags.suppress_error] tag is inserted in code cells to enable
|
|
152
|
-
with generating documentation. The symbol '⚠' is an indicator that the error was suppressed. Normally
|
|
153
|
-
this is due to the timeout but there is no distinction on the type of error.
|
|
154
|
-
|
|
155
151
|
#### Useful links
|
|
156
152
|
|
|
157
153
|
These links are not relevant for docstrings.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: async-kernel
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.18.0
|
|
4
4
|
Summary: A concurrent python kernel for Jupyter supporting AnyIO, AsyncIO and Trio.
|
|
5
5
|
Project-URL: Homepage, https://fleming79.github.io/async-kernel
|
|
6
6
|
Project-URL: Documentation, https://fleming79.github.io/async-kernel
|
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '0.
|
|
22
|
-
__version_tuple__ = version_tuple = (0,
|
|
21
|
+
__version__ = version = '0.18.0'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 18, 0)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -233,7 +233,7 @@
|
|
|
233
233
|
"source": [
|
|
234
234
|
"## Caller methods that return Pending\n",
|
|
235
235
|
"\n",
|
|
236
|
-
"Pending is
|
|
236
|
+
"Pending is a thread-safe representation of a future result. It was designed to provide thread-safe functionality similar [asyncio.Future](https://docs.python.org/3/library/asyncio-future.html#asyncio.Future) and was named `Pending` to avoid confusion about differences in functionality to that of `asyncio.Future` and `concurrent.futures.Future`.\n",
|
|
237
237
|
"\n",
|
|
238
238
|
"The following functions return a `Pending` object:\n",
|
|
239
239
|
"\n",
|
|
@@ -187,10 +187,7 @@
|
|
|
187
187
|
"editable": true,
|
|
188
188
|
"slideshow": {
|
|
189
189
|
"slide_type": ""
|
|
190
|
-
}
|
|
191
|
-
"tags": [
|
|
192
|
-
"suppress-error"
|
|
193
|
-
]
|
|
190
|
+
}
|
|
194
191
|
},
|
|
195
192
|
"outputs": [],
|
|
196
193
|
"source": [
|
|
@@ -223,13 +220,12 @@
|
|
|
223
220
|
"slide_type": ""
|
|
224
221
|
},
|
|
225
222
|
"tags": [
|
|
226
|
-
"thread"
|
|
227
|
-
"suppress-error"
|
|
223
|
+
"thread"
|
|
228
224
|
]
|
|
229
225
|
},
|
|
230
226
|
"outputs": [],
|
|
231
227
|
"source": [
|
|
232
|
-
"# This time we'll use the tag to run the cell in a
|
|
228
|
+
"# This time we'll use the tag to run the cell in a worker thread\n",
|
|
233
229
|
"await demo()"
|
|
234
230
|
]
|
|
235
231
|
},
|
|
@@ -249,6 +245,160 @@
|
|
|
249
245
|
"# thread\n",
|
|
250
246
|
"%callers # magic provided by async-kernel"
|
|
251
247
|
]
|
|
248
|
+
},
|
|
249
|
+
{
|
|
250
|
+
"cell_type": "markdown",
|
|
251
|
+
"id": "11",
|
|
252
|
+
"metadata": {},
|
|
253
|
+
"source": [
|
|
254
|
+
"We can also specify CallerCreateOptions as part of the top line"
|
|
255
|
+
]
|
|
256
|
+
},
|
|
257
|
+
{
|
|
258
|
+
"cell_type": "code",
|
|
259
|
+
"execution_count": null,
|
|
260
|
+
"id": "12",
|
|
261
|
+
"metadata": {},
|
|
262
|
+
"outputs": [],
|
|
263
|
+
"source": [
|
|
264
|
+
"# thread name=\"My thread\"\n",
|
|
265
|
+
"%callers"
|
|
266
|
+
]
|
|
267
|
+
},
|
|
268
|
+
{
|
|
269
|
+
"cell_type": "markdown",
|
|
270
|
+
"id": "13",
|
|
271
|
+
"metadata": {},
|
|
272
|
+
"source": [
|
|
273
|
+
"## Asynchronous magic\n",
|
|
274
|
+
"\n",
|
|
275
|
+
"Asynchronous line (%) and cell (%%) magic functions are supported. Any line or cell magic that returns an awaitable is awaited before proceeding.\n",
|
|
276
|
+
"\n",
|
|
277
|
+
"- **[thread magic](#thread-magic)**\n",
|
|
278
|
+
"- **[asyncio magic](#specify-the-backend)**\n",
|
|
279
|
+
"- **[trio magic](#specify-the-backend)**\n",
|
|
280
|
+
"\n",
|
|
281
|
+
"### thread magic\n",
|
|
282
|
+
"\n",
|
|
283
|
+
"This will run the code in a thread. When no settings are provided a cell worker thread is used.\n",
|
|
284
|
+
"\n",
|
|
285
|
+
"#### Comparing thread magic with thread run mode\n",
|
|
286
|
+
"\n",
|
|
287
|
+
"- thread magic (`%%thread`) is an asynchronous magic that executes the associated **code** in a separate thread. \n",
|
|
288
|
+
"- [thread run mode](#run-mode-thread) (`# thread`) instructs the kernel to run the **entire cell** in a separate thread, bypassing the shell execute request queue."
|
|
289
|
+
]
|
|
290
|
+
},
|
|
291
|
+
{
|
|
292
|
+
"cell_type": "code",
|
|
293
|
+
"execution_count": null,
|
|
294
|
+
"id": "14",
|
|
295
|
+
"metadata": {},
|
|
296
|
+
"outputs": [],
|
|
297
|
+
"source": [
|
|
298
|
+
"# Run the magic 'callers' in a caller worker thread.\n",
|
|
299
|
+
"%thread %callers "
|
|
300
|
+
]
|
|
301
|
+
},
|
|
302
|
+
{
|
|
303
|
+
"cell_type": "markdown",
|
|
304
|
+
"id": "15",
|
|
305
|
+
"metadata": {},
|
|
306
|
+
"source": [
|
|
307
|
+
"To specify a thread (caller) by name"
|
|
308
|
+
]
|
|
309
|
+
},
|
|
310
|
+
{
|
|
311
|
+
"cell_type": "code",
|
|
312
|
+
"execution_count": null,
|
|
313
|
+
"id": "16",
|
|
314
|
+
"metadata": {},
|
|
315
|
+
"outputs": [],
|
|
316
|
+
"source": [
|
|
317
|
+
"%%thread name=\"My executor\" \n",
|
|
318
|
+
"%callers"
|
|
319
|
+
]
|
|
320
|
+
},
|
|
321
|
+
{
|
|
322
|
+
"cell_type": "markdown",
|
|
323
|
+
"id": "17",
|
|
324
|
+
"metadata": {},
|
|
325
|
+
"source": [
|
|
326
|
+
"Many of arguments accepted on `Caller.get` are also supported. Let's use a thread with a trio backend."
|
|
327
|
+
]
|
|
328
|
+
},
|
|
329
|
+
{
|
|
330
|
+
"cell_type": "code",
|
|
331
|
+
"execution_count": null,
|
|
332
|
+
"id": "18",
|
|
333
|
+
"metadata": {},
|
|
334
|
+
"outputs": [],
|
|
335
|
+
"source": [
|
|
336
|
+
"%%thread name=\"My trio executor\" backend=trio\n",
|
|
337
|
+
"%callers\n",
|
|
338
|
+
"\n",
|
|
339
|
+
"import trio\n",
|
|
340
|
+
"\n",
|
|
341
|
+
"await trio.sleep(0)"
|
|
342
|
+
]
|
|
343
|
+
},
|
|
344
|
+
{
|
|
345
|
+
"cell_type": "markdown",
|
|
346
|
+
"id": "19",
|
|
347
|
+
"metadata": {},
|
|
348
|
+
"source": [
|
|
349
|
+
"## Specify the backend\n",
|
|
350
|
+
"\n",
|
|
351
|
+
"Code that is written for a specific backend ('asyncio' or 'trio') can be run in the same thread with one of the following:\n",
|
|
352
|
+
"\n",
|
|
353
|
+
"- Line magic - The code following the magic on the same line is run using the specified backend.\n",
|
|
354
|
+
" - `%trio` \n",
|
|
355
|
+
" - `%asyncio` \n",
|
|
356
|
+
"\n",
|
|
357
|
+
"- Cell magic - The code block is run using the specified backend. \n",
|
|
358
|
+
" - `%%trio`\n",
|
|
359
|
+
" - `%asyncio`\n",
|
|
360
|
+
"\n",
|
|
361
|
+
"**Note: trio must be installed for this demo to work.**"
|
|
362
|
+
]
|
|
363
|
+
},
|
|
364
|
+
{
|
|
365
|
+
"cell_type": "code",
|
|
366
|
+
"execution_count": null,
|
|
367
|
+
"id": "20",
|
|
368
|
+
"metadata": {},
|
|
369
|
+
"outputs": [],
|
|
370
|
+
"source": [
|
|
371
|
+
"%asyncio await asyncio.sleep(0) # This code gets run in an asyncio task \n",
|
|
372
|
+
"%trio await trio.sleep(0) # trio run as line magic"
|
|
373
|
+
]
|
|
374
|
+
},
|
|
375
|
+
{
|
|
376
|
+
"cell_type": "code",
|
|
377
|
+
"execution_count": null,
|
|
378
|
+
"id": "21",
|
|
379
|
+
"metadata": {},
|
|
380
|
+
"outputs": [],
|
|
381
|
+
"source": [
|
|
382
|
+
"%%trio # trio cell magic\n",
|
|
383
|
+
"\n",
|
|
384
|
+
"def print_info():\n",
|
|
385
|
+
" from aiologic.lowlevel import current_async_library\n",
|
|
386
|
+
" print(f\"\"\"\n",
|
|
387
|
+
" Kernel backend: {get_ipython().kernel.interface.backend}\n",
|
|
388
|
+
" Current backend: { current_async_library()}\n",
|
|
389
|
+
" \"\"\") \n",
|
|
390
|
+
"\n",
|
|
391
|
+
"\n",
|
|
392
|
+
"print_info()\n",
|
|
393
|
+
"await trio.sleep(0)\n",
|
|
394
|
+
"\n",
|
|
395
|
+
"%callers\n",
|
|
396
|
+
"\n",
|
|
397
|
+
"%asyncio print_info()\n",
|
|
398
|
+
"%asyncio %callers\n",
|
|
399
|
+
"\n",
|
|
400
|
+
"await trio.sleep(0)"
|
|
401
|
+
]
|
|
252
402
|
}
|
|
253
403
|
],
|
|
254
404
|
"metadata": {
|
|
@@ -19,7 +19,9 @@
|
|
|
19
19
|
"\n",
|
|
20
20
|
"We can use uv to create a virtual environment for different versions of Python.\n",
|
|
21
21
|
"\n",
|
|
22
|
-
"Let's create a new virtual environment in the folder named \".venv_py315\" using uv
|
|
22
|
+
"Let's create a new virtual environment in the folder named \".venv_py315\" using uv.\n",
|
|
23
|
+
"\n",
|
|
24
|
+
"**Requires a recent version of uv to be installed.**"
|
|
23
25
|
]
|
|
24
26
|
},
|
|
25
27
|
{
|
|
@@ -29,7 +31,7 @@
|
|
|
29
31
|
"metadata": {},
|
|
30
32
|
"outputs": [],
|
|
31
33
|
"source": [
|
|
32
|
-
"%uv venv .venv_py315 --python 3.15\n",
|
|
34
|
+
"%uv venv .venv_py315 --python 3.15 --clear\n",
|
|
33
35
|
"%uv pip install --directory .venv_py315 --python 3.15 async-kernel"
|
|
34
36
|
]
|
|
35
37
|
},
|
|
@@ -56,10 +58,10 @@
|
|
|
56
58
|
"assert uv_path.exists()\n",
|
|
57
59
|
"\n",
|
|
58
60
|
"write_kernel_spec(\n",
|
|
59
|
-
" kernel_name=\"
|
|
60
|
-
" display_name=\"Python 3.15 (async
|
|
61
|
-
" env={\"UV_PROJECT_ENVIRONMENT\": uv_path
|
|
62
|
-
" executable=(\"uv\", \"run\", \"python\", \"-m\"),\n",
|
|
61
|
+
" kernel_name=\"async_3.15\",\n",
|
|
62
|
+
" display_name=\"Python 3.15 (async)\",\n",
|
|
63
|
+
" env={\"UV_PROJECT_ENVIRONMENT\": str(uv_path)},\n",
|
|
64
|
+
" executable=(\"uv\", \"run\", \"--no-sync\", \"python\", \"-m\", \"async_kernel\"),\n",
|
|
63
65
|
")"
|
|
64
66
|
]
|
|
65
67
|
},
|
|
@@ -68,7 +70,7 @@
|
|
|
68
70
|
"id": "5",
|
|
69
71
|
"metadata": {},
|
|
70
72
|
"source": [
|
|
71
|
-
"The kernel spec with the display name \"Python 3.15 (async kernel)\" has been added."
|
|
73
|
+
"The kernel spec with the display name \"Python 3.15 (async kernel)\" has been added. You will need to refresh the list of kernels for it to be available."
|
|
72
74
|
]
|
|
73
75
|
}
|
|
74
76
|
],
|
|
@@ -7,7 +7,8 @@ from async_kernel.kernel import Kernel
|
|
|
7
7
|
from async_kernel.kernelspec import PROTOCOL_VERSION
|
|
8
8
|
from async_kernel.pending import Pending
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
distribution_name = "async-kernel"
|
|
11
|
+
__version__ = version(distribution_name=distribution_name)
|
|
11
12
|
|
|
12
13
|
kernel_protocol_version = PROTOCOL_VERSION
|
|
13
14
|
kernel_protocol_version_info = {
|