当前位置:项目开发->项目经验 ->python实现内存缓存的原理和实现分析

原创版权标志python实现内存缓存的原理和实现分析

作者:codexia  发表时间:2017/12/9 8:47:31  阅读:
[摘要] 对于单python文件,执行完后,就退出了。那么此时python的进程就没有了,进程空间也没有了。那么此时就给我们带来了一个疑惑:python是不是就不能实现内存缓存的机制了?
    python是一门脚本语言,脚本语言就是边解释边执行的语言。对于python文件,可以当做一个独立的程序直接执行,执行的主体是python解释器。当python文件执行的时候,操作系统会调用python解释器来执行python代码。调用python解释器的时候,也就是创建了一个解释器的进程,在这个进程空间中,加载python文件的代码并执行。
    对于单python文件,执行完后,就退出了。那么此时python的进程就没有了,进程空间也没有了。那么此时就给我们带来了一个疑惑:python是不是就不能实现内存缓存的机制了?
    对于这个问题,很早之前我就已经用了,但是却没有仔细去思考。代码都是基于内存缓存的思想做的,也很好的工作了。但是在后来想着实现内存缓存的时候,却被上述的疑问给难住了。说来真是好笑,都已经实现了的东西,自己竟然没有发现。当时实现的时候,是按照C/C++的思维写的,也就没有想那么多。而后来推敲问题的时候,就只想着python的特性,以至于忘记了之前写的内存缓存的程序。现在又重构了之前的内存缓存程序,才发现这个情况。
    那么这种情况只是我的个例吗?当然不是!这种实现了但是不清楚甚至不懂的情况,太常见了。这也是水平不能提升的问题所在。也就是说,如果你只是把东西做出来了,但是从来不想想你做的东西的原理,或者深层次的原理或者更全面的细节和原理,那么在后面在遇到类似的问题,你依然不清楚,甚至以为没有做过,就和我现在这样的情况一样。而我这种情况是按照C/C++的习惯就写出来,后来只按照python语言的特性去思考竟然没有联想在一起。这就说明我并没有融会贯通,导致我后面一段时间都在疑问python到底能不能实现内存缓存。
    今天就仔细分析了一下,分享给大家。
    虽然python是脚本语言,但是在操作系统里执行,必然都会有一个进程的。只要有进程,那么就可以实现内存缓存。内存缓存也就是常驻内存的变量。一般可以是全局变量、静态变量等。那么有了这个理论基础,内存缓存的实现也就好分析了。
    python有没有静态变量或者全局变量呢?查询一下资料得知,python有一个global关键词来定义全局变量。全局变量的存储不是仅限于一个python模块文件的。所以,即使一个模块文件执行完了,全局变量依然存在。所以说,这个全局变量是基于进程全局空间的全局变量,只要python的进程存在,此全局变量就存活着。
    那么python的进程在哪里呢?
    python在执行的时候,系统创建了解释器进程,这个进程就是python的进程。python模块文件会加载到这个进程空间里,那么全局变量也就到了这个进程的进程空间中。进程空间也就是进程的内存区域。只要主进程不退出,那么后续的模块就可以访问此前python模块创建的全局变量。当然,都需要是同一个进程空间的。
    而在python的web编程中,不如webpy或flask,都会启动一个主进程,然后监听端口。这个就是后续所有模块执行的主进程。那么后续模块创建的全局变量都会在这个主进程的内存里。只要主进程一直运行着,那么全局变量就可以被其他模块共享。这也是内存缓存的基础。
    我们用python写Web接口,对于接口我们要做优化,就可以使用内存缓存来做。其实实现也很简单,就是存全局变量。当存储的内存量到一定程度,那么就自动清掉内存。大量反复的请求,因为有了内存缓存,可以避免无意义的数据库操作以及其他操作,这样也就提高了接口的性能。
    我们这里只拿全局变量作为例子来说了。至于静态变量,我暂时还没有研究。
    那么如何测试呢?
    我们使用webpy来测试。我们配置一个简单的接口,可以在浏览器直接访问。然后接口每次调用的时候,都修改一下全局变量的值,并返回。每次修改只是对上次全局变量的值的加一。然后不停的刷新接口,可以发现全局变量的值在不断的变化。
    代码如下:
global a
a=0 #全局变量

class Test(object):
 def GET(self):
 #接口
 web.header('Access-Control-Allow-Origin', "*")
 params = web.input()
 global a
 print a
 a+=1
 return a

        效果图如下:

    python实现内存缓存的原理和实现分析

         通过刷新,浏览器显示的值在不断的更新增加。这也就是python内存缓存的机制。每次接口调用,都是一个全新的请求,但是变量值是可以延续的。这就是内存缓存的作用。

        有了内存缓存机制的机制,接口可以大大加速。具体的应用就看你自己去包装这个过程了。其实实现内存缓存并不是难事,不要动不动就去依赖第三方。你会发现,其实也不是什么难事,在你自己实现了一遍之后,用其他的缓存库就更加顺手了,理解更加深刻。

文章来源:C++技术网原创文章版权为网站和作者共同所有,会员文章禁止转载。非会员文章转载做好本文超链接即表示授权转载。通过文章下面的分享按钮可以自由分享所有文章。

返回顶部

在线提问
问题标题:
问题描述:(简陋的描述会导致问题被最后回答、没有针对性回答甚至无法解答。请确保问题描述的足够清楚。)