中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python流程控制常用工具詳解

發布時間:2020-10-05 10:15:48 來源:腳本之家 閱讀:145 作者:yaominghui 欄目:開發技術

在我們的工作中,我們使用ddagent ver。5作為收集工具,收集和報告托管服務器的性能指標,并對ddagent進行一定程度的定制。經過多次功能迭代,發現一批在線運行時間長的托管服務器占用了太多內存。分析問題機器上進程樹中每個節點的占用情況,可以看出ddagent集合進程的內存占用仍然很高。

我們將學習最基本的流程控制工具,比如

if 條件判斷for 循環while 循環

作為保證業務系統穩定運行的監控組件,存在內存泄漏,這自然是非常嚴重的,所以我們開始了我們的“故障排除之旅”。

if-elif-else 判斷

Python流程控制常用工具詳解

分析

有很多工具可以分析和導出Python程序的內存狀態。在這里,我們使用pyrasite,它可以附加到正在運行的Python程序,生成內存快照,并檢查當前哪些對象類型占用了多少內存,并從大到小排序。

使用命令非常簡單: pyrasite-memory-viewer <PID>,同時會生成一份快照文件: /tmp/pyrasite-<PID>-objects.json。

由于無法提供真實的生產數據,下面提到的所有數據都來自問題版本在測試環境中運行12小時后的采樣。

在pyrasite提供的Cui視圖中,我們可以清楚地看到字典類型的對象實例占用的內存最多,達到3.4mb,有6621個實例:

Python流程控制常用工具詳解

while 循環

While循環也是一種常見的循環方式。這種循環通常以循環體類或條件方式結束。它不可能無限期地進行下去。

Python流程控制常用工具詳解

對于泄漏情況,我們有以下事實和猜測:

一個或多個位置持續創建空字典對象,并且無法回收它們,從而導致內存泄漏內存泄漏量隨時間而增加。在索引收集業務中,泄漏很可能是在每個收集過程中引起的,并在間隔期之后重復觸發我們看不到當前依賴的ddagent版本存在尚未關閉的相關問題,這可能是在我們的定制過程中引入的錯誤

[
 [
 [".../embedded/lib/python2.7/threading.py",774,"__bootstrap","self.__bootstrap_inner()"],
 [".../embedded/lib/python2.7/threading.py",801,"__bootstrap_inner","self.run()"],
 [".../modules/monitor/bot/schedule.py",51,"run","task.run()"],
 [".../modules/monitor/bot/task.py",50,"run","super(RepeatTask, self).run()"],
 [".../modules/monitor/bot/task.py",18,"run","self.check()"],
 [".../modules/monitor/checks/collector.py",223,"wrapper","_check.run()"],
 [".../modules/monitor/checks/__init__.py",630,"run","self._roll_up_instance_metadata()"],
 [".../modules/monitor/checks/__init__.py",498,"_roll_up_instance_metadata","dict((k, v) for (k, v) in self._instance_metadata))"],
 [".../modules/monitor/tracer.py",33,"__init__","self.trace_info = traceback.extract_stack()"]
 ],
 [
 [".../embedded/lib/python2.7/threading.py",774,"__bootstrap","self.__bootstrap_inner()"],
 [".../embedded/lib/python2.7/threading.py",801,"__bootstrap_inner","self.run()"],
 [".../modules/monitor/bot/schedule.py",51,"run","task.run()"],
 [".../modules/monitor/bot/task.py",50,"run","super(RepeatTask, self).run()"],
 [".../modules/monitor/bot/task.py",18,"run","self.check()"],
 [".../modules/monitor/checks/collector.py",223,"wrapper","_check.run()"],
 [".../modules/monitor/checks/__init__.py",630,"run","self._roll_up_instance_metadata()"],
 [".../modules/monitor/checks/__init__.py",498,"_roll_up_instance_metadata","dict((k, v) for (k, v) in self._instance_metadata))"],
 [".../modules/monitor/tracer.py",33,"__init__","self.trace_info = traceback.extract_stack()"]
 ],
 [
 [".../embedded/lib/python2.7/threading.py",774,"__bootstrap","self.__bootstrap_inner()"],
 [".../embedded/lib/python2.7/threading.py",801,"__bootstrap_inner","self.run()"],
 [".../modules/monitor/bot/schedule.py",51,"run","task.run()"],
 [".../modules/monitor/bot/task.py",50,"run","super(RepeatTask, self).run()"],
 [".../modules/monitor/bot/task.py",18,"run","self.check()"],
 [".../modules/monitor/checks/collector.py",223,"wrapper","_check.run()"],
 [".../modules/monitor/checks/__init__.py",630,"run","self._roll_up_instance_metadata()"],
 [".../modules/monitor/checks/__init__.py",498,"_roll_up_instance_metadata","dict((k, v) for (k, v) in self._instance_metadata))"],
 [".../modules/monitor/tracer.py",33,"__init__","self.trace_info = traceback.extract_stack()"]
 ],
...

重播

我們不提“做好設計審查和規范審查”、“加強試驗階段質量檢驗工作”等“老生常談”,也值得我們反思。

要徹底防止和控制內存泄漏幾乎是不可能的,像rust這樣的安全編程語言也不能保證程序不會泄漏內存。

許多引發內存不安全的行為,如數組訪問越界、訪問釋放后的內存等,都可以通過制定更嚴格的編程模型(如rust提出的所有權+生命周期規則)甚至數據競爭問題來避免。

然而,觸發內存泄漏的行為,如競爭條件,需要開發人員將開發組件和業務規則結合起來。設想一個需要手動觸發刷新的數據隊列。結果,我們在推送數據時忘記調用它。這種內存泄漏無法通過任何常規檢查規則來識別。

關鍵字函數是為了更形象地說明傳入參數的位置和具體用法。如果一個函數有四個或五個參數,而且一次傳入的參數太多,那么很難讓人眼花繚亂。如果key=value用于傳入。

總結

通過本節的學習,我們了解了通過if else在不同條件下控制代碼流和執行不同代碼。for/while和如何定義函數有兩種不同的循環方法,包括函數的返回值和參數傳遞方法、position參數傳遞和向函數傳遞參數時的key=value參數傳遞。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

互助| 金川县| 特克斯县| 崇文区| 贺兰县| 礼泉县| 龙井市| 响水县| 嵊州市| 喜德县| 华池县| 青田县| 孙吴县| 广安市| 定西市| 合水县| 阜宁县| 城口县| 营口市| 浦县| 基隆市| 南城县| 谢通门县| 襄汾县| 铅山县| 巴东县| 湖北省| 永川市| 洱源县| 安塞县| 吴江市| 涟源市| 巴马| 芦溪县| 永定县| 黄浦区| 永州市| 宜丰县| 城固县| 临洮县| 北川|