python threadpool的記憶體占用問題

2022-05-17 23:21:23 字數 2532 閱讀 8141

先說結論:

在使用多執行緒時,不要使用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

print

"[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

print

"[main] mem %s

" %mem

obj =test()

obj.test()

mem =psutil.process(os.getpid()).memory_info().rss

print

"[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 來呼叫的。所謂成員函式只是在名義上是類裡的。其實成員函式的大小不在類的物件裡面,同乙個類的多個物件共享函式 而我們訪問類的成員函式是通過類裡面的...