黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

python內(nèi)存泄漏

系統(tǒng) 2077 0

python基本運(yùn)行機(jī)制。Python程序運(yùn)行時(shí)不需要編譯成二進(jìn)制代碼,而直接從源碼運(yùn)行程序,簡(jiǎn)單來(lái)說(shuō)是,Python解釋器將源碼轉(zhuǎn)換為字節(jié)碼,然后再由解釋器來(lái)執(zhí)行這些字節(jié)碼。

解釋器的具體工作:

1 完成模塊的加載和鏈接;

2 將源代碼編譯為PyCodeObject對(duì)象(即字節(jié)碼),寫(xiě)入內(nèi)存中,供CPU讀取;

3 從內(nèi)存中讀取并執(zhí)行,結(jié)束后將PyCodeObject寫(xiě)回硬盤(pán)當(dāng)中,也就是復(fù)制到.pyc或.pyo文件中,以保存當(dāng)前目錄下所有腳本的字節(jié)碼文件;

* 之后若再次執(zhí)行該腳本,它先檢查【本地是否有上述字節(jié)碼文件】和【該字節(jié)碼文件的修改時(shí)間是否與其腳本一致】。是就直接執(zhí)行,否則重復(fù)上述步驟。

?

如果你的程序是死循環(huán),不停歇的代碼,下列是需要注意內(nèi)存的問(wèn)題。
第一、pillow庫(kù)的隱患

            #內(nèi)存將發(fā)生泄漏
from PIL import  Image

im = Image.open('1.jpg')
im.save()

#使用with使程序更安全
from PIL import  Image

with open('1.jpg' , 'rb') as open_file:
    im = Image.open(open_file)

          

第二、使用importlib.reload重載模塊后帶來(lái)使用全局變量帶來(lái)的隱患
假如采取不重啟程序方式,自動(dòng)重新載入修改后的文件,所以需要進(jìn)行重載模塊

            #run.py
import importlib

while True:
    module_name = importlib.import_module('.', 'test_file')
    module_name = importlib.reload(module_name)
    result = module_name.main(params)

#test_file.py
global_value = {'dataList':[],
                'number':'',}
key = '初始值'

def main(params):

    # params攜帶著此次任務(wù)數(shù)據(jù)

    global_value['number'] = params['number']
    get_data1(params)
    get_data2(params)
    return global_value

def get_data1(params):
    global key
    # 你的程序通過(guò)params得到新的數(shù)據(jù)
    data_once = {'每次運(yùn)行產(chǎn)生的鍵': '每次運(yùn)行產(chǎn)生的鍵值'}
    key = '新值'
    global_value['dataList'].append(data_once)

def get_data2(params):
    # 你的程序通過(guò)params和key新的值,得到另一份數(shù)據(jù)
    data_once = {'每次運(yùn)行產(chǎn)生的新鍵': '每次運(yùn)行產(chǎn)生的新鍵值'}
    global_value['dataList'].append(data_once)

          

上述就會(huì)發(fā)生一種隱患,以前我覺(jué)得垃圾回收機(jī)制很靠譜。但是當(dāng)每一次重載模塊時(shí),global_value將使用新的地址,原來(lái)的地址還放著上一次的數(shù)據(jù),沒(méi)有被釋放掉
就算你在每次循環(huán)里添加gc.collect()也不能快速回收刪除上一次的數(shù)據(jù),導(dǎo)致內(nèi)存持續(xù)增長(zhǎng)。。。


我的處理方式是
(1)將global_value這個(gè)轉(zhuǎn)移進(jìn)函數(shù)內(nèi),通過(guò)傳參將get_data1和get_data2數(shù)據(jù)整合在一個(gè)變量里
(2)將所有函數(shù)放在一個(gè)類中,也可以避免全局變量數(shù)據(jù)存活時(shí)間太長(zhǎng)


總結(jié),雖然使用全局變量很省事,不用傳參,其他函數(shù)改變其值再被其他函數(shù)調(diào)用很方便,卻會(huì)導(dǎo)致內(nèi)存泄漏,因?yàn)槊恳淮蝦eload時(shí)產(chǎn)生的是新的內(nèi)存地址。


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論