【python】threadpool的記憶體佔用問題

來源:互聯網
上載者:User

標籤:多線程   tar   結果   釋放記憶體   對比   最大   json   reads   pid   

先說結論:

在使用多線程時,不要使用threadpool,應該使用threading, 尤其是資料量大的情況。因為threadpool會導致嚴重的記憶體佔用問題!

 

對比threading和threadpool的記憶體佔用

# coding=utf-8import timeimport osimport psutilimport jsonimport threadpoolimport threadingclass TEST(object):    # 擷取資料,使用yield, 每次返回一個len=10的list, list中的每一項是一個線程的資料    def get_data(self):        multi_list = list()        for i in range(100):            data = "abcdefg" * 100000            multi_list.append(data)            if len(multi_list) % 10 == 0:                yield multi_list                multi_list = list()    # 測試函數    def test(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    def deal_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    def deal_multi_thread(self, data_list):        threads = list()        for data in data_list:            threads.append(threading.Thread(target=self.sub_task, args=(data,)))        for t in threads:            t.start()        for t in threads:            t.join()    def sub_task(self, data):        returnif __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.

 

【python】threadpool的記憶體佔用問題

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.