Jupyter笔记本电脑,如何同时运行多个单元?

时间:2019-05-11 21:44:25

标签: python parallel-processing jupyter-notebook ipython

我定义了一个运行bash脚本的python函数。假设函数为:calc(x,y,z)。如果我在python中使用一些变量运行此函数,

>>> calc(1,2,3)

它会生成一个C代码,该C代码使用变量(x=1, y=2, z=3)模拟某些内容,然后编译C代码并执行编译后的输出文件。

我想在jupyter笔记本中同时运行具有不同calc(x,y,z)的多个(x,y,z)。您可能已经注意到,问题在于jupyter笔记本中的单元格是按顺序执行的。如果我运行三个calc函数,则它花费的时间是一个函数运行时间的三倍。

我尝试了两种方法,但是效果不佳。

  1. 使用multiprocessing模块:通过使用该模块,可以在“一个单元格”中同时执行多个calc。但是为了进行以后的分析,我想同时使用多个处理器(或cpu内核)同时执行多个单元,每个单元仅包含一个calc
  2. 使用ipyparallel细胞魔术(受此answer启发):导入ipyparallel后,我尝试进行以下操作

    # Cell 1
    %%px --targets 0 # use processor 0
    calc(1,1,1)
    

    # Cell 2
    %%px --targets 1 # use processor 1
    calc(2,2,2)        
    

    # Cell 3
    %%px --targets 2 # use processor 2
    calc(3,3,3) 
    

但是单元格是顺序执行的:单元格2仿真完成后,即执行单元格2,与单元格3类似。

如何使用不同的内核运行多个jupyter单元?

1 个答案:

答案 0 :(得分:0)

在您的解决方案中,单元由您期望的不同引擎执行。该问题是由默认阻止行为引起的。您可以简单地添加--noblock参数以非阻塞模式执行单元。然后,单元格返回AsyncResult对象,一旦执行完毕,就可以通过调用方法display_outputs()来读取输出。转到文档以获取详细信息targets-and-blocking

# Cell 1
%%px --targets 0 --noblock
calc(1,1,1)

# Cell 2
%%px --targets 1 --noblock
calc(2,2,2)   

# Cell 3
%%px --targets 2 --noblock
calc(3,3,3) 

如果您需要访问输出,则可以如上所述调用display_outputs()

# output of the first the cell 1
___.display_outputs()

# output of the first the cell 2
__.display_outputs()

# output of the first the cell 1
_.display_outputs()

我使用下划线表示法来访问单元格1-3返回的AsyncResult对象。还有许多其他方法可以访问这些对象,例如使用Out[x],其中x是执行单元格后在笔记本中可见的单元格执行编号。