在 jupyter notebook 中更改单元执行的优先级?

数据挖掘 Python 朱庇特
2022-02-27 23:11:08

我有时会遇到以下情况:

  • 我想执行两个单元格:单元格 1 大约需要 10 分钟或几小时。单元格 2 需要 1 秒。

  • 我宁愿先执行单元格 2 并查看结果,但我事先并不知道,因此已经启动了单元格 1。

  • 单元 1 已经大量参与计算,因此中止它会很浪费。

如何先暂停单元格 1,然后启动单元格 2,然后再次启动单元格 1?或者更好的是,如何暂停单元格 1,启动单元格 2,并在单元格 2 完成后让单元格 1 自动重新启动?

1个回答

我认为 Jupyter 笔记本(甚至通过扩展)目前不提供暂停/重新启动单元块。我建议将两个单元格的代码放入一个单元格中,并使用 Python 逻辑来确定执行顺序。

但是,一般来说,您不能严格暂停某事的执行并稍后再返回。如果您中止函数的执行,中间结果将丢失(因为它们存储在您刚刚杀死的函数的命名空间中)。这是因为 Python 一次只运行一个进程(关键术语:全局解释器锁)。

您唯一能做的就是创建一个单元格 0,它执行某种检查,测试单元格 1 可能需要多长时间运行,然后只需将单元格 1 和单元格 2 放入以及 if/else 构造中给出正确的订购使用。


其他方法

您可能想研究类似多处理库的东西。在那里,您可以创建一组工作处理器,您可以将单元格 1的内容和单元格 2 的内容同时发送到它们。它们将使用两个不同的进程同时计算,即两个不同的实例Python 解释器。如果(在您的情况下)单元格 1 和单元格 2 之间没有直接依赖关系,这很容易实现。多处理在您的长时间运行的单元格受计算限制的情况下特别有用,这意味着必须执行大量计算。

另一种选择是研究线程模块和一般的并发编程,但这会变得更复杂一些,并且可能超出您在您的情况下想要的(它还需要更多的努力来实现多处理)。这使得 Python 可以同时做两件事,但使用共享状态 - 因此每个正在运行的线程都可以更改另一个线程可能也在更改的变量,这可能需要大量工作才能确保安全。然而,当您的任务受 IO 限制时,这种方法是有益的,即没有大的计算,而是您将数据发送到例如网站并等待返回 - 您的大部分时间都花在等待上。