iT邦幫忙

0

Python Singleton的class 內置換屬性會造成記憶體無法回收

現在我有一個singleton的架構的class如下

我到時候會透過reset的function去刷新其屬性

不過我發現我每更新一次他記憶體佔用就會上升並且不會釋放

def singleton(clz):
    instances = {}
    
    def getinstance(*args, **kwargs):
        if clz not in instances:
            instances[clz] = clz(*args, **kwargs)
        return instances[clz]
    return getinstance

def get_data(a=1, b=2, c=3, d=4):
    return a, b, c, d

@singleton
class MyClass:
    a, b, c, d = get_data()  
    
    def reset_data(self):
        self.a, self.b, self.c, self.d = get_data(4, 3, 2, 1)

當我

import MyClass

c = MyClass()

c.reset_data()

一直重複執行reset_data, 我記憶體就會一直leak...

不知道是哪邊理解錯誤?

看更多先前的討論...收起先前的討論...
froce iT邦大師 1 級 ‧ 2019-12-10 20:03:55 檢舉
幫你測了1000000次,完全沒有leak問題啊。

ubuntu 19.10 python 3.7.5
是因為我執行點是在uwsgi worker上嗎?
我之前用singnal讓全workers去執行這段
froce iT邦大師 1 級 ‧ 2019-12-11 16:45:48 檢舉
很可能,不過照理說,應該只會有worker數量的instance在執行,也不應該會造成leak。
目前不會了,我覺得主因在於我內部實作架構太複雜 我實際上reset_data內部又會掉用一個class內的serilaizer去組織資料, 而那個class也是singleton的結構, 後來我把主程式簡化, 透過一個外部function去組織資料最後回傳到一個singleton的class dataset
之後變更也是變更這個dataset class. 就不會造成記憶體leak
造成原因可能還要深入去瞭解哈哈哈
froce iT邦大師 1 級 ‧ 2019-12-12 11:05:11 檢舉
這種複雜的架構不是我的專長,雖然有興趣但沒辦法幫太多。哈

如果常得處理這種複雜的架構,建議要不要換golang來處理。
不用過一層wsgi server、好用的goroutine、語言本身也不會是效能瓶頸。
謝謝froce大大您的建議, 我在有機會可以重構架構的時候我會把這個考慮進去

尚未有邦友回答

立即登入回答