异步Python Jupyter内核
项目描述
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
现在,依赖于 b
的 a
将自动更新,单元格 1 的输出是 3
。
当然,您可以通过在其他变量之上定义变量来定义更复杂的数据流。
单元格执行缓存
使用此模式,单元格执行将被缓存,以便下次运行单元格时,其输出将从缓存中检索(如果其输入未更改)。输入和输出从单元格代码中推断。
多内核仿真模式
此模式在同一个内核中仿真多个内核。通过使用执行请求的会话 ID 实现内核隔离。因此,您可以将多个笔记本连接到同一个内核,而它们不会共享执行状态。
这对于单元格是异步的尤其有用,因为它们不会阻塞内核。因此,同一个内核可以“共享”并由可能很多笔记本使用,从而大大减少资源使用。
限制
这仍然是一个正在进行中的工作,特别是
stdout
/stderr
重定向到单元格输出只能通过print
函数来实现。- 目前没有丰富的表示,只支持标准的
__repr__
。这意味着还没有 matplotlib 图形 :-( 但由于 ipywidgets 的工作,为什么不使用 ipympl 呢? :-)
项目详情
下载文件
下载适合您平台的项目文件。如果您不确定选择哪个,请了解有关 安装软件包 的更多信息。
源分布
构建分布
akernel-0.2.0.tar.gz 的散列值
算法 | 散列摘要 | |
---|---|---|
SHA256 | f8616167ea4ae99ffdde85a83c0670126e00887a4a28878279bbe1177d4288af |
|
MD5 | f4a8a3a2143e05619c090d4631fdacbc |
|
BLAKE2b-256 | 02417f068d93c35c1073371300496a446510a2ee0490ec744a4a380c6fa0d41c |
akernel-0.2.0-py3-none-any.whl 的散列值
算法 | 散列摘要 | |
---|---|---|
SHA256 | 865aef8aaf7ce2a00cd832f6976bad2316775706263cf25c96eb2b3883ee9366 |
|
MD5 | d04d017192c0612e036db5b5c98cae4e |
|
BLAKE2b-256 | 4a577d620e83156b08b015702299a754c7d3ef63980b0641ce71d7b497c07b45 |