使用Jupyter Notebook为什么会kernel died?
1. 什么是kernel?
Python是一种解释型语言,由python解释器来解释一行,并执行一行。
Python源文件通常用.py为扩展名,当源文件被解释器加载或者显式地进行字节码编译的时候会被编译成字节码,字节码会被保存为.pyc 或.pyo扩展名的文件,具体是哪个扩展名,取决于解释器的类型和调用解释器的方式。
python有五种常用的Python解释器:
(1)CPython
当从Python官方网站下载并安装好Python2.7后,就直接获得了一个官方版本的解释器:Cpython,这个解释器是用C语言开发的,所以叫CPython,在命名行下运行python,就是启动CPython解释器,CPython是使用最广的Python解释器。在命令行下输入python,看到">>>",其实就是启动了CPython解释器
(2)IPython
IPython是基于CPython之上的一个交互式解释器,也就是说,IPython只是在交互方式上有所增强,但是执行Python代码的功能和CPython是完全一样的,好比很多国产浏览器虽然外观不同,但内核其实是调用了IE。Jupyter Notebook就是使用IPython解释器。
(3)PyPy
PyPy是另一个Python解释器,它的目标是执行速度,PyPy采用JIT技术,对Python代码进行动态编译,所以可以显着提高Python代码的执行速度。
(4)Jython
Jython是运行在Java平台上的Python解释器,可以直接把Python代码编译成Java字节码执行。
JPython的优势有:
只要有 Java 虚拟机,就能运行 Jython
拥有访问 Java 包与类库的能力
为 Java 开发环境提供了脚本引擎
能够很容易的测试 Java 类库
提供访问 Java 原生异常处理的能力
继承了 JavaBeans 特性和内省能力
鼓励 Python 到 Java 的开发(反之亦然)
GUI 开发人员可以访问 Java 的 AWT/Swing 库
利用了 Java 原生垃圾收集器(CPython 未实现此功能)
(5)IronPython
IronPython和Jython类似,只不过IronPython是运行在微软.Net平台上的Python解释器,可以直接把Python代码编译成.Net的字节码。
2. IPython kernel与Jupyter Notebook的关系
先看下图了解Jupyter Notebook的架构
用户在浏览器里写代码,点击运行后,代码从浏览器发送给Web服务器(tornado),接着从Web服务器发送消息到Kernel(python)执行代码,在Kernel中执行代码产生的输出/错误会被发送给Web服务器,接着发往给浏览器,用户于是看到输出,这就是Notebook的工作原理。
再看一下上图中最右边的部分,可以看到Notebook Server和Kernel之间采用ZeroMQ进行通信,和大多数多进程系统一样,Server和Kernel之间通过心跳机制来监测双方是否还live,整个系统才能保持正常运作。心跳机制的实现方式是定期发一条消息给对方,如果收到对方回复就知道对方还live,如何等了一段时间没收到就认为对方died。
如果Server将Kernel判定为died了,真实情况有两种:
(1)Kernel这个进程由于执行出错,被操作系统杀掉了,确实died了;
(2) Kernel还活着,只是通信被阻塞了,Server在有限的时间内没有收到回应,于是Server认为Kernel死了,其实真实情况是kernel并没有死,只是没被检测到还活着。
那么,如果你在使用Notebook时经常碰到kernel died,如何解决呢?
对应以上两种情况,就有两种解决办法:
(1) 检测代码,避免出现内存溢出的错误,因为碰到这种错误,进程无法自愈,只能由操作系统将其杀掉;
(2) 延长心跳机制的等待时间,降低误判进程已死的可能性。
- 点赞
- 收藏
- 关注作者
评论(0)