先說結論:
在使用多執行緒時,不要使用threadpool,應該使用threading, 尤其是資料量大的情況。因為threadpool會導致嚴重的記憶體占用問題!
對比threading和threadpool的記憶體占用
#coding=utf-8
import
time
import
osimport
psutil
import
json
import
threadpool
import
threading
class
test(object):
#獲取資料,使用yield, 每次返回乙個len=10的list, list中的每一項是乙個執行緒的資料
defget_data(self):
multi_list =list()
for i in range(100):
data = "
abcdefg
if len(multi_list) % 10 ==0:
yield
multi_list
multi_list =list()
#測試函式
deftest(self):
for data in
self.get_data():
mem =psutil.process(os.getpid()).memory_info().rss
"[test] mem %s
" % mem #
列印記憶體占用情況
self.deal_threadpool(data) #
使用threadpool
#self.deal_multi_thread(data) # 使用threading
#待對比方法,threadpool
defdeal_threadpool(self, data_list):
pool = threadpool.threadpool(10)
requests =threadpool.makerequests(self.sub_task, data_list)
[pool.putrequest(req)
for req in
requests]
pool.wait()
#待對比方法,threading
defdeal_multi_thread(self, data_list):
threads =list()
for data in
data_list:
for t in
threads:
t.start()
for t in
threads:
t.join()
defsub_task(self, data):
return
if__name__ == "
__main__":
mem =psutil.process(os.getpid()).memory_info().rss
"[main] mem %s
" %mem
obj =test()
obj.test()
mem =psutil.process(os.getpid()).memory_info().rss
"[main] mem %s
" % mem
結果:1. 使用threadpool時
[main] mem 9760768[test] mem 16764928[test] mem 23924736[test] mem 26820608[test] mem 29720576[test] mem 31911936[test] mem 34795520[test] mem 36978688[test] mem 39161856[test] mem 41340928[test] mem 43524096[main] mem 43606016
2. 使用threading時
[main] mem 9760768[test] mem 16764928[test] mem 23838720[test] mem 16969728[test] mem 23838720[test] mem 16969728[test] mem 23838720[test] mem 16973824[test] mem 23842816[test] mem 16973824[test] mem 23842816[main] mem 16973824
對比可以看出,
使用threading時,每次執行緒退出可以正確的釋放記憶體,記憶體占用的最大值很穩定。
使用threadpool時,每次執行緒退出後記憶體都沒有釋放,而是一直累加。在我實際使用的過程中,從mongo獲取了大量的資料,threadpool在處理過程中占用的記憶體高達50g,而使用threading後記憶體占用穩定在了1g.
gnome shell程序占用記憶體過多的問題
ps auxwww grep gnome shell user pid cpu mem vsz rss tty stat start time command root 22522 0.5 48.1 23940220 15854516 sl 1月21 1388 02 usr bin gnome sh...
簡單幾步解決svchost占用記憶體過高問題
第一步當然是ctrl alt del調出任務管理器,找出引起記憶體過高的 元凶 了。注意觀察我標註的部分,要勾選 顯示所有使用者的程序 因為系統也是乙個使用者呀,只不過是隱藏較深的後台使用者,這樣就能檢視系統開啟的任務了。可以看出scvhost這個任務占用了我一半的記憶體!但是又不能簡簡單單的暴力的...
類記憶體占用
類所佔記憶體的大小是由成員變數 靜態變數除外 決定的,成員函式 是不計算在內的。成員函式還是以一般的函式一樣的存在。a.fun 是通過fun a.this 來呼叫的。所謂成員函式只是在名義上是類裡的。其實成員函式的大小不在類的物件裡面,同乙個類的多個物件共享函式 而我們訪問類的成員函式是通過類裡面的...