架构#

此页面包含有关 Jupyter 生态系统核心部分不同架构设计的信息。其中一些是独立项目,另一些则展示了项目之间的关系。

项目概览#

下面是项目关系的高级可视化概览。它截至 2022 年是最新信息。

Architecture diagram of Jupyter project relationships from servers, applications, API, and kernels.

IPython 内核#

本节重点介绍 IPython 和内核。当我们讨论 IPython 时,我们谈论两个基本角色:

  • 作为熟悉的 REPL 的终端 IPython

  • IPython 内核,IPykernel,它提供计算并与前端接口(如 notebook)进行通信

终端 IPython#

当您键入 ipython 时,您会获得原始的 IPython 界面,在终端中运行。它做类似这样的事情:

while True:
    code = input(">>> ")
    exec(code)

当然,它要复杂得多,因为它必须处理多行代码、使用 readline 的 tab 补全、魔术命令等等。但其模型类似于代码示例:提示用户输入一些代码,当他们输入完成后,在同一进程中执行它。这种模型通常被称为 REPL,即读取-求值-打印-循环。

IPython 内核#

所有其他接口——Notebook、Qt 控制台、终端中的 ipython console 以及第三方接口——都使用 IPython 内核。IPykernel 是一个独立的进程,负责运行用户代码以及计算可能的补全等任务。前端(如 notebook 或 Qt 控制台)使用通过 ZeroMQ 套接字发送的 JSON 消息与 IPython 内核通信;前端与 IPython 内核之间使用的协议在Jupyter 消息传递中描述。

内核的核心执行机制与终端 IPython 共享。

一个内核进程可以同时连接到多个前端。在这种情况下,不同的前端将可以访问相同的变量。

这种设计旨在允许在相同内核上轻松开发不同的前端,但它也使得通过用这些语言开发内核来支持相同前端中的新语言成为可能,我们正在改进 IPython 以使其更加实用。

如今,开发其他语言内核有三种方式:

  • 包装器内核重用 IPykernel 的通信机制,并仅实现核心执行部分。

  • 原生内核在目标语言中实现执行和通信。

  • 基于 xeus 的内核,xeus 是协议的原生实现,它实现了内核的语言特定部分。与包装器方法相反,xeus 不依赖于 Python 运行时。

对于具有良好 Python 包装器的语言,如 octave_kernel,或者难以实现通信机制的语言,如 bash_kernel,包装器内核更容易快速编写。原生内核可能由使用它们的社区更好地维护,如 IJuliaIHaskell。当语言解释器提供 C++ 或 C API 时,xeus 内核很容易编写。

Jupyter Notebook 格式#

Jupyter Notebook 是结构化数据,表示您的代码、元数据、内容和输出。保存到磁盘时,notebook 使用扩展名 .ipynb,并使用 JSON 结构。有关 notebook 格式结构和规范的更多信息,请参阅nbformat 文档

Jupyter Notebook 界面#

Jupyter Notebook 及其灵活的界面将 notebook 扩展到代码之外,包括可视化、多媒体、协作等。除了运行您的代码外,它还将代码和输出以及 Markdown 笔记存储在一个可编辑的文档中,称为 notebook。当您保存它时,它会从您的浏览器发送到 Jupyter 服务器,Jupyter 服务器将其作为带有 .ipynb 扩展名的 JSON 文件保存到磁盘。

Jupyter 服务器是一个通信中心。浏览器、磁盘上的 notebook 文件和内核不能直接相互通信。它们通过 Jupyter 服务器进行通信。Jupyter 服务器(而不是内核)负责保存和加载 notebook,因此即使您没有该语言的内核,您也可以编辑 notebook——您只是无法运行代码。内核对 notebook 文档一无所知:它只在用户运行代码时接收要执行的代码单元。

将 Jupyter Notebook 导出为其他格式#

Jupyter 中的 Nbconvert 工具将 notebook 文件转换为其他格式,例如 HTML、LaTeX 或 reStructuredText。此转换通过一系列步骤进行:

  1. 预处理器修改内存中的 notebook。例如,ExecutePreprocessor 运行 notebook 中的代码并更新输出。

  2. 导出器将 notebook 转换为另一种文件格式。大多数导出器都使用模板来完成此操作。

  3. 后处理器处理导出生成的文件。

nbviewer 网站使用 nbconvert 和 HTML 导出器。当您给它一个 URL 时,它会从该 URL 获取 notebook,将其转换为 HTML,然后将该 HTML 提供给您。

IPython.parallel#

IPython 还包括一个并行计算框架 IPython.parallel。这允许您控制许多独立的引擎,它们是上面描述的 IPython 内核的扩展版本。

JupyterHub 和 Binder#

JupyterHub 是一个多用户中心,它生成、管理和代理多个单用户 Jupyter notebook 服务器实例。这可用于提供各种接口和环境,并且可以在多种基础设施上运行。Kubernetes 上的 JupyterHub 是一个用于在 Kubernetes 基础设施上运行 JupyterHub 的 Helm Chart,而 BinderHub 是一个定制的 JupyterHub 部署,用于可共享、可重现的交互式计算环境。

下面的链接描述了 JupyterHub 和 JupyterHub 的几种发行版的架构。

JupyterLab#

JupyterLab 是一个灵活、可扩展的交互式计算界面。以下是一些有助于理解 JupyterLab 架构的有用链接。