Skip to main content

jupyasyncclient

jupyasyncclient runs code on Jupyter kernels hosted by any server speaking the standard kernels API: jupygate, or jupyter_server. Kernel lifecycle (create, interrupt, restart, delete) is plain HTTP; messaging is one websocket per client carrying standard Jupyter message dicts with a channel key. There is no zmq and no tornado in the client process, and every send is genuinely awaited - the zmq-side subtleties (sync-send edge consumption, slow-joiner subscriptions, socket identity contracts) all live server-side.

Three classes cover the usual shapes, mirroring jupyter_client where familiarity helps:

  • JupyAsyncKernelClient - one kernel: lifecycle, channels, and messaging. execute, complete, inspect, history, kernel_info, wait_for_ready, and per-channel get_*_msg accessors work like their jupyter_client namesakes; any request can await its reply directly with reply=True; and every *_request message type in the protocol is callable by name, subshell requests included, so new protocol messages need no client release.
  • JupyAsyncKernelManager - start/stop one kernel and mint clients for it.
  • JupyAsyncMultiKernelManager - a fleet, with keyed reuse: ensure_kernel('some-key') returns the live kernel registered under that key or starts a fresh one.

The core notebook builds the client bottom-up with every method demonstrated against a live server; the managers are thin HTTP wrappers and live in plain modules.

Install

pip install jupyasyncclient

Plus a server to talk to. The examples here use jupygate serving ipymini kernels; a stock jupyter_server works identically (the test suite runs against one).

Use

import asyncio, time
from jupygate.core import create_app, serve
server = serve(create_app(), port=8812, in_thread=True)
while not getattr(server, 'started', False): time.sleep(0.05)
server.started
True

start_new_server_kernel gives a running kernel and a ready client in one call:

km, kc = await start_new_server_kernel('http://127.0.0.1:8812')
rep = await kc.execute("print('hello'); 6*7", reply=True, timeout=30)
rep['content']['status']
'ok'

Outputs arrive on the iopub queue, like jupyter_client:

m = await kc.get_iopub_msg(timeout=15)
while m['msg_type'] != 'stream': m = await kc.get_iopub_msg(timeout=15)
m['content']['text']
'hello\n'

input() in the kernel becomes an input_request on the stdin queue; answer it with input, which parents the reply properly:

fut = asyncio.ensure_future(kc.execute("name = input('who? ')", reply=True, timeout=30))
prompt = await kc.get_stdin_msg(timeout=15)
kc.input('Jeremy')
(await fut)['content']['status']
'ok'

Any protocol request type works by name, reply=True awaiting its reply - here JEP 91 subshells, no client support required beyond the message type:

sub = (await kc.create_subshell(reply=True, timeout=15))['content']['subshell_id']
rep = await kc.execute('40+2', reply=True, timeout=30, subshell_id=sub)
await kc.delete_subshell(sub, reply=True, timeout=15)
rep['content']['status']
'ok'

The multimanager runs fleets, with keyed reuse for “the kernel for X” patterns:

mkm = JupyAsyncMultiKernelManager('http://127.0.0.1:8812')
k1 = await mkm.ensure_kernel('analysis')
k2 = await mkm.ensure_kernel('analysis')
k1 == k2
True
await kc.aclose()
await km.aclose()
await mkm.shutdown_all()
await mkm.aclose()

Auth is a bearer token when the server requires one: pass token=... to any of the three classes and it is sent as an Authorization header on HTTP and a query param on the websocket.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

jupyasyncclient-0.2.1.tar.gz (18.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

jupyasyncclient-0.2.1-py3-none-any.whl (15.8 kB view details)

Uploaded Python 3

File details

Details for the file jupyasyncclient-0.2.1.tar.gz.

File metadata

  • Download URL: jupyasyncclient-0.2.1.tar.gz
  • Upload date:
  • Size: 18.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.2

File hashes

Hashes for jupyasyncclient-0.2.1.tar.gz
Algorithm Hash digest
SHA256 ac524109cdfb0fbdc724bd5574909316fe200d9a8201c8ee86aa1d4ea126eac5
MD5 4ade015119100da549ffe53fc939cd37
BLAKE2b-256 2eac565bf89433742a8e44cfa0ca60b428417283c74ab2d4e67f2351120d3326

See more details on using hashes here.

File details

Details for the file jupyasyncclient-0.2.1-py3-none-any.whl.

File metadata

File hashes

Hashes for jupyasyncclient-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 95d35a390c8ed744b9e763c55ef97c1f9a8b05cbe39323fcbe9614a79223d808
MD5 c7a3881b9e3e198b97e26b2f6869ccaf
BLAKE2b-256 25d3c2127383ebdbf4283de90ac18a8614606bb23d3162f88ba3507255886b4a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page