Re: [問題] constructor

看板Python作者 (.)時間11年前 (2014/12/16 18:24), 11年前編輯推噓1(104)
留言5則, 4人參與, 最新討論串2/2 (看更多)
※ 引述《sean72 (.)》之銘言: : 標題: [問題] constructor : 時間: Tue Dec 16 15:49:41 2014 : : import socket : : class TCP: : def __init__(self, ip, port): : self.abc = 'hello' : : s = socket.socket(xxxxxxxx) : s.connect(ip, port) # use python lib to create tcp connection : : : conn = TCP(192.168.1.1, 1234) : : : 上面是一段pseudo code : 請問如果s.connect()沒有成功 : python raise err : __init__()沒有完成 : 變數conn也不會成功的allocate memory : 但是self.abc這個變數呢? 會默默地吃掉一些記憶體嗎? : 應該不會才對吧? 因為self, 也就是conn沒有成功的init : : : : : -- : ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 76.169.54.91 : ※ 文章網址: http://www.ptt.cc/bbs/Python/M.1418716183.A.466.html : → uranusjr: 其實事情比你想的要複雜很多, 但要解釋清楚很麻煩 12/16 16:32 : → uranusjr: 在這個例子裡 Python 會幫你把它搞定, 不用想太多 12/16 16:32 我手邊有一個案子 python system是一個在Linux上面執行的app python 跑了一周左右會莫名的掛掉 Linux活著 因此推測是python 吃了太多系統資源而被OS關掉 其中一個徵兆是free memory不斷的減少 因此推測python app有memory leak 從app內部err log可知 python app在閒置狀態什麼事情都沒有做 唯一執行的是: 嘗試重新tcp連線 但是因為並沒有接上一個實體的ethernet device 所以連線一定 time out 所以python app一直re-connect -> socket close -> re-connect -> socket close memory leak我能想到的原因有 1. 一個無限制增加的 global list / dict 2. cyclic referencing 3. recursive無窮迴圈 但是程式裡面都沒有上面三個寫法 因此懷疑 if there was any memory not free-ed by pyhton when __init__ failed 謝謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 76.169.54.91 ※ 文章網址: http://www.ptt.cc/bbs/Python/M.1418725458.A.C5F.html ※ 編輯: sean72 (76.169.54.91), 12/16/2014 18:25:39

12/16 19:32, , 1F
從你的程式看不出來有memory leak
12/16 19:32, 1F

12/16 20:07, , 2F
直接用 Valgrind 來看看是不是有 leak 最快
12/16 20:07, 2F

12/16 20:09, , 3F
如果有再進一步來抓看看是否有哪個 PyObject 沒被放掉
12/16 20:09, 3F

12/17 00:14, , 4F
可以用 Guppy 的 heapy 看 heap 上 PyObject 的變化
12/17 00:14, 4F

12/17 11:02, , 5F
你推論跳太快了, 至少先 ps 一下證明是 Python 在吃啊
12/17 11:02, 5F
文章代碼(AID): #1Ka0XInV (Python)
討論串 (同標題文章)
本文引述了以下文章的的內容:
0
2
完整討論串 (本文為第 2 之 2 篇):
1
5
0
2
文章代碼(AID): #1Ka0XInV (Python)