【整理】Python之JIT、Django、Greenlet和Stackless

China☆狼群 提交于 2019-12-07 04:16:31

【JIT】

即时编译(Just-in-time compilation),又称为动态编译,是一种提高程序运行效率的方法。
通常程序有两种编译方式:静态编译与动态编译(直译)。在静态编译中,程序在执行前全部被翻译为机器码,而动态直译则是边运行边翻译。
即时编译器则混合了这二者,一句一句编译源代码,但是会将翻译过的代码缓存起来以降低性能损耗。相对于静态编译代码,即时编译的代码可以处理延迟绑定并增强安全性。即时编译器有两种类型,一是字节码翻译,二是动态编译翻译。

另外,一般来讲编译执行比解释执行要快,但是编译之后又不能跨平台,那我们就到目标平台上去,先编译再执行,这样就比纯解释要快了。这种编译是在“运行”的时候自动进行的,所以叫即时编译(JIT)。

Django

Django是一个开放源代码的Web应用框架,由Python写成。采用了MVC(Model View Controller)的设计模式,M是指数据模型,V是指用户界面,C则是控制器。
它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的。并于2005年7月在BSD许可证下发布。这套框架是以比利时的吉普赛爵士吉他手Django Reinhardt来命名的。

Django的主要目标是使得开发复杂的、数据库驱动的网站变得简单。Django注重组件的重用性和“可插拔性”,敏捷开发和DRY(Don't Repeat Yourself)法则。在Django中Python被普遍使用,甚至包括配置文件和数据模型。

【Greenlet

Greenlet是Stackless的副产品,其将微线程称为 “tasklet” 。tasklet运行在伪并发中,使用channel进行同步数据交换。一个”greenlet”,是一个更加原始的微线程的概念,但是没有调度,或者叫做协程。这在你需要控制你的代码时很有用。你可以自己构造微线程的 调度器;也可以使用”greenlet”实现高级的控制流。例如可以重新创建构造器;不同于Python的构造器,我们的构造器可以嵌套的调用函数,而被嵌套的函数也可以yield一个值。Greenlet是作为一个C扩展模块给未修改的解释器的。

tasklet

一个tasklet对象对应一个Python线程内的微任务。Tasklet的特点就是轻量级和可移植性,并且可以作为系统线程或进程的非常好的替代物。在程序启动的时候,总是存在一个运行的主tasklet。

【Stackless】

Stackless Python是Python程序语言的一个增强版本。其能够使程序员获得基于线程编程的好处,而免受与传统线程模型相伴的性能和复杂度问题的困扰。Stackless为Python引入了微线程的概念(microthread),其占用系统资源少,属于轻量级的东东。如果使用得当,你将获得如下益处:
a) 更好的程序结构 
b) 更据可读性的代码
c) 提高程序员的代码生产力

在您想通过使用Stackless获得便利的时候,只有那么一点点的来自stackless模块的功能性信息需要你注意一下:

Microthreads: tasklet封装了 允许以microthreads形式被启动的函数。
Channels:channels可被用于两个tasklet之间的双向通信。
Scheduling:内置的循环调度器。其可以被用于合作式或者优先级式调度tasklets。

Serialisation:可以通过pickling方式将tasklets序列化到硬盘以便后期恢复。

【Pickling】

Stackless的主要特性之一就是其可以对tasklet进行pickle和unpickle。这意味着运行于tasklet内部的程序能够被持续不断的存储到文件或者字符串中。之后,其可以基于之前停止的点重新恢复运行,并且该行为不限于同一台机器。

【Scheduler

在Stackless Python之中存在一个简单的内置调度器(scheduler),其按顺序循环遍历调度器list以调度注册其中的tasklet。当一个tasklet被创建后,其自动被添加到调度器list的尾部。然而,调度器需要通过人为的主动调用才能开始工作。最简单的运行调度器的方式是采用stackless模块中提供的方法。该方法会移除主tasklet,然后轮流调度每一个注册的tasklet直到在调度器list为空。



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!