Pending Kernels¶
Added in 7.1.0
In scenarios where an kernel takes a long time to start (e.g. kernels running remotely), it can be advantageous to immediately return the kernel’s model and ID from key methods like .start_kernel()
and .shutdown_kernel()
. The kernel will continue its task without blocking other managerial actions.
This intermediate state is called a “pending kernel”.
How they work¶
When .start_kernel()
or .shutdown_kernel()
is called, a Future
is created under the KernelManager.ready
property. This property can be awaited anytime to ensure that the kernel moves out of its pending state, e.g.:
# await a Kernel Manager's `.ready` property to
# block further action until the kernel is out
# of its pending state.
await kernel_manager.ready
Once the kernel is finished pending, .ready.done()
will be True
and either 1) .ready.result()
will return None
or 2) .ready.exception()
will return a raised exception
Using pending kernels¶
The most common way to interact with pending kernels is through the MultiKernelManager
—the object that manages a collection of kernels—by setting its use_pending_kernels
trait to True
. Pending kernels are “opt-in”; they are not used by default in the MultiKernelManager
.
When use_pending_kernels
is True
, the following changes are made to the MultiKernelManager
:
start_kernel
andstop_kernel
return immediately while running the pending task in a background thread.- The following methods raise a
RuntimeError
if a kernel is pending: restart_kernel
interrupt_kernel
shutdown_kernel
- The following methods raise a
shutdown_all
will wait for all pending kernels to become ready before attempting to shut them down.