跳转到主要内容

异步Python Jupyter内核

项目描述

Build Status Code style: black Binder

akernel

一个具有不同风味的Python Jupyter内核

  • 并发单元格执行,
  • 响应式编程,
  • 单元格执行缓存,
  • 多内核仿真。

安装

pip install akernel
# pip install akernel[react]  # if you want to be able to use reactive programming
# pip install akernel[cache]  # if you want to be able to use cell execution caching

您可以为akernel的执行模式进行参数化

akernel install  # default (chained cell execution mode)
akernel install concurrent  # concurrent cell execution mode
akernel install react  # reactive programming mode
akernel install cache  # cell execution caching  mode
akernel install multi  # multi-kernel emulation mode
akernel install cache-multi-react-concurrent  # you can combine several modes

动机

ipykernel 提供了从REPL运行异步代码的能力 运行异步代码。这意味着您可以在异步函数之外的最高级别使用 await。遗憾的是,这仍然会阻塞内核。

akernel通过在任务中启动每个单元格来改变这种行为。默认情况下,单元格任务会链式执行,这意味着单元格将在上一个单元格完成后开始执行。您可能会想,这不是和ipykernel一样吗?嗯,并不完全一样。在ipykernel中,当异步单元格执行时,它也会阻塞处理 Comm消息,这阻止了内核与例如JupyterLab小部件等交互(参见 这里那里)。在akernel中,情况并非如此。

如果您想完全让单元格并发执行,也可以这样做(见下文)。

功能

异步执行

首先,设置并发执行模式,以便异步单元格可以并发执行(您也可以在安装时通过 akernel install concurrent 来完成此操作)

__unchain_execution__()
# __chain_execution__()

akernel 允许异步代码执行。这意味着当在 Jupyter 笔记本中使用时,如果代码是协作的,您可以在并发中运行单元格。例如,您可以运行以下代码的单元格:

# cell 1
for i in range(10):
    print("cell 1:", i)
    await asyncio.sleep(1)

由于此单元格是 async(它包含一个 await),它不会阻塞其他单元格的执行。因此,您可以并发地运行另一个单元格,前提是这个单元格也是协作的

# cell 2
for j in range(10):
    print("cell 2:", j)
    await asyncio.sleep(1)

如果单元格 2 是阻塞的,单元格 1 将会暂停,直到单元格 2 完成。您可以通过将单元格 2 中的 await asyncio.sleep(1) 改为 time.sleep(1) 来看到这一点。

您可以使用它使一个单元格等待上一个单元格完成

# cell 3
await __task__()  # wait for cell 2 to be finished
print("cell 2 has run")

响应式编程

其他笔记本提供的一个功能是变量能够响应其他变量变化的能力。《Observable notebooks》(可观察笔记本)是这方面的良好示例,它可以提供全新的用户体验。例如,您可以无序地运行单元格

# cell 1
a = b + 1  # "b" is not defined yet
a

执行单元格 1 不会导致“未定义变量”错误。相反,操作的结果是未定义的,单元格 1 的输出是 None。然后您可以继续定义 b

# cell 2
b = 2  # triggers the computation of "a" in cell 1

现在,依赖于 ba 将自动更新,单元格 1 的输出是 3

当然,您可以通过在其他变量之上定义变量来定义更复杂的数据流。

screencast

单元格执行缓存

使用此模式,单元格执行将被缓存,以便下次运行单元格时,其输出将从缓存中检索(如果其输入未更改)。输入和输出从单元格代码中推断。

多内核仿真模式

此模式在同一个内核中仿真多个内核。通过使用执行请求的会话 ID 实现内核隔离。因此,您可以将多个笔记本连接到同一个内核,而它们不会共享执行状态。

这对于单元格是异步的尤其有用,因为它们不会阻塞内核。因此,同一个内核可以“共享”并由可能很多笔记本使用,从而大大减少资源使用。

限制

这仍然是一个正在进行中的工作,特别是

  • stdout/stderr 重定向到单元格输出只能通过 print 函数来实现。
  • 目前没有丰富的表示,只支持标准的 __repr__。这意味着还没有 matplotlib 图形 :-( 但由于 ipywidgets 的工作,为什么不使用 ipympl 呢? :-)

项目详情


下载文件

下载适合您平台的项目文件。如果您不确定选择哪个,请了解有关 安装软件包 的更多信息。

源分布

akernel-0.2.0.tar.gz (19.4 kB 查看散列)

上传时间

构建分布

akernel-0.2.0-py3-none-any.whl (24.4 kB 查看散列值)

上传时间 Python 3

支持者