python cache快取模組

2021-09-24 16:15:14 字數 1540 閱讀 8645

這種方法下要快取的函式只能寫作類函式,因為需要繼承cacheable類。不知是否有什麼改進方法?

from datetime import datetime

def cached(time):

def make_cacheable(func):

func.should_be_cached = true

func.time_out = time

return func

return make_cacheable

class cacheable(object):

__cache__ = {}

def cache_that(self, func):

name = "%s%r%r" % (func.__name__, args, kw)

if name not in self.__cache__ or ( datetime.today() - self.__cache__["time"] ).total_seconds() > func.time_out:

self.__cache__[name] = func(*args, **kw)

self.__cache__["time"] = datetime.today()

return self.__cache__[name]

#內建函式。類中的函式每次被呼叫時,都是先通過該函式找到函式名對應的函式,再執行

def __getattribute__(self, attr):

function = super(cacheable, self).__getattribute__(attr)

if attr != 'cache_that' and callable(function) and hasattr(function, 'should_be_cached'):

return self.cache_that(function)

return function

class monitor(cacheable):

def __init__(self):

pass

@cached(100)

def fetch_list(self):

list =

#connect db and get list

return list

順便說說裝飾器。

網上很多都說如果函式b裝飾a,那麼呼叫a就等於呼叫b(a)。但這種是在裝飾器沒有引數的前提下。當裝飾器有引數時,被裝飾的函式就不是相當於傳遞引數那樣傳遞的了。

具體的機理我也不太懂,反正如果裝飾器有引數的話,是需要在裝飾器的內部再定義乙個函式,然後返回這個函式。這個函式的唯一引數就是被裝飾的函式名。如果該函式又需要有引數,那麼就有需要在其內部定義乙個函式,直到函式沒有引數。注意,不是呼叫這個函式而是返回這個函式,因為呼叫的話是需要在函式名後加 () 的。而正如我上面的**中,make_cacheable後面不帶括號。

如果裝飾器是類,那麼呼叫被裝飾函式時就會先生成乙個裝飾類。

但是如果裝飾器是類內函式呢?也會先生成乙個裝飾類,然後呼叫這個函式?

nginx四 之快取模組

提高 響應速度是 web應用不容忽視的目標,在之前動靜分離的基礎上,我們已經降低了後端伺服器壓力,提高了處理請求的效能,但是使用者請求的靜態資源是從硬碟讀取,相比記憶體的效能還有很大的提高 nginx 自帶的快取模組可以把靜態資源快取到記憶體中,提高了使用者請求靜態資源的速度,並且 nginx 自帶...

解決Python import模組的快取問題

在使用django開發的平台中,支援使用者自定義函式,但是每次使用者進行修改編輯後,該模組內容已更改,然後重新匯入該模組,但是python 會認為 我已經匯入了該模組,不需要再次讀取該檔案 所以更改將無效。因此,每次更改檔案的內容時,都必須退出並重新啟動django。使用python開發後台服務程式...

拆解discuz NT之一 快取模組

最近一直在改discuz!nt,感覺discuz!nt做出了就是讓別人來改的,呵呵,因為它雖然很完善,但是實際使用的時候總有不如意的地方,要想改它,就要很好的了解它,不然牽一髮而動全身啊,我改的版本是2.5的,已經有2.6的版本了,不過是沒辦法公升級使用了,因為改的太多了 一直好奇的是discuz!...