python基本運行機制。Python程序運行時不需要編譯成二進(jìn)制代碼,而直接從源碼運行程序,簡單來說是,Python解釋器將源碼轉(zhuǎn)換為字節(jié)碼,然后再由解釋器來執(zhí)行這些字節(jié)碼。
解釋器的具體工作:
1 完成模塊的加載和鏈接;
2 將源代碼編譯為PyCodeObject對象(即字節(jié)碼),寫入內(nèi)存中,供CPU讀取;
3 從內(nèi)存中讀取并執(zhí)行,結(jié)束后將PyCodeObject寫回硬盤當(dāng)中,也就是復(fù)制到.pyc或.pyo文件中,以保存當(dāng)前目錄下所有腳本的字節(jié)碼文件;
* 之后若再次執(zhí)行該腳本,它先檢查【本地是否有上述字節(jié)碼文件】和【該字節(jié)碼文件的修改時間是否與其腳本一致】。是就直接執(zhí)行,否則重復(fù)上述步驟。
?
如果你的程序是死循環(huán),不停歇的代碼,下列是需要注意內(nèi)存的問題。
第一、pillow庫的隱患
#內(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重載模塊后帶來使用全局變量帶來的隱患
假如采取不重啟程序方式,自動重新載入修改后的文件,所以需要進(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
# 你的程序通過params得到新的數(shù)據(jù)
data_once = {'每次運行產(chǎn)生的鍵': '每次運行產(chǎn)生的鍵值'}
key = '新值'
global_value['dataList'].append(data_once)
def get_data2(params):
# 你的程序通過params和key新的值,得到另一份數(shù)據(jù)
data_once = {'每次運行產(chǎn)生的新鍵': '每次運行產(chǎn)生的新鍵值'}
global_value['dataList'].append(data_once)
上述就會發(fā)生一種隱患,以前我覺得垃圾回收機制很靠譜。但是當(dāng)每一次重載模塊時,global_value將使用新的地址,原來的地址還放著上一次的數(shù)據(jù),沒有被釋放掉
就算你在每次循環(huán)里添加gc.collect()也不能快速回收刪除上一次的數(shù)據(jù),導(dǎo)致內(nèi)存持續(xù)增長。。。
我的處理方式是
(1)將global_value這個轉(zhuǎn)移進(jìn)函數(shù)內(nèi),通過傳參將get_data1和get_data2數(shù)據(jù)整合在一個變量里
(2)將所有函數(shù)放在一個類中,也可以避免全局變量數(shù)據(jù)存活時間太長
總結(jié),雖然使用全局變量很省事,不用傳參,其他函數(shù)改變其值再被其他函數(shù)調(diào)用很方便,卻會導(dǎo)致內(nèi)存泄漏,因為每一次reload時產(chǎn)生的是新的內(nèi)存地址。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

