请教 Python 多线程内存不释放怎么排查

r150r:新手写了一个多线程的爬虫,所有线程都执行完了,但是一直占着 1.5GB 的内存(任务数越多不释放的内存越多)
不知道怎么排查哪里出问题,pympler 看不太懂问题到底出在哪里,请教该如何正确的排查问题

执行多线程函数的代码:

    def mainfunc(tasknum, thread):
        tr = tracker.SummaryTracker()
        tr.print_diff()
        list = []
        for i in range(tasknum):
            list.append(str(i))
        pool = threadpool.ThreadPool(thread)
        requests = threadpool.makeRequests(childfunc, list)
        for req in requests:
            pool.putRequest(req)
        pool.wait()
        tr.print_diff()

tr.print_diff()打印的内容

初始化:

                     types |   # objects |   total size
========================== | =========== | ============
                      list |        3741 |    350.84 KB
                       str |        3739 |    260.01 KB
                       int |         673 |     18.40 KB
                      dict |           2 |    352     B
                     tuple |           4 |    256     B
                      code |           1 |    144     B
     function (store_info) |           1 |    136     B
                      cell |           2 |     96     B
  functools._lru_list_elem |           1 |     80     B
                    method |          -1 |    -64     B

所有线程结束后:

                                types |   # objects |   total size
===================================== | =========== | ============
                                 dict |      202860 |     43.69 MB
                                 list |      100169 |      8.47 MB
                                  str |      102446 |      5.62 MB
               threadpool.WorkRequest |      100000 |      5.34 MB
                                  int |      100836 |      3.08 MB
                   _io.BufferedReader |         294 |      2.35 MB
                                tuple |        1480 |     93.30 KB
                                 type |          76 |     85.98 KB
                                 code |         572 |     80.57 KB
                                bytes |        1219 |     51.49 KB
                                  set |          32 |     43.50 KB
                        socket.socket |         294 |     27.56 KB
       pymysql.connections.Connection |         294 |     16.08 KB
                      socket.SocketIO |         294 |     16.08 KB
  DBUtils.SteadyDB.SteadyDBConnection |         294 |     16.08 KB

scriptB0y:线程池里面的任务,检查一下所有的函数最后都有 return,没有的加一下,再试试。

Python 爬虫 js 分析

MrhuangSTR:一般遇到 js 加密参数的,能通过全局搜索定位到对应的 js 文件,然后就没有然后了,试过网上搜索通过打断点调试分析加密逻辑,但是对于那些 js 反混淆比较厉害的就束手无策,网上搜对应的博客看的也是云里雾里,请问当你遇到这种不知道该如何下手的时候你们是怎么处理的?如何提高自己的 js 分析能力

Python 如何查某关键词在百度网页第几页?

cizimo:例如,在百度搜索 XXX 关键词后,想知道包含 YYY 的词在搜索结果的第几页? 这个能做到吗? 或者说有没有教程,砸一个链接给我呗,谢谢大家啦

Python 有没有监听鼠标点击网页相关元素的包呢?

18870715400:具体需求 比如说打开了 www.baidu.com ,当你鼠标点击了“百度一下”就可以获得这个对应的 id 或者是对应的 xpath 语法 如果没有对应的包,那么有什么可以具体实现的思路呢?

Python 现在最好用的包管理是啥?

maichael:最近为了给测试搭自动化测试,重新开始搞起 Python,但是整体工程结构比较苦恼。 重点是版本管理,requirements.txt 感觉不怎么好用。Pipenv? Tox? 还是其它的啥? 以及像 package.json 里 scripts 的用法,python 有类似的吗?cdyrhh:poetry

Python 如何优雅地处理子线程异常?

Te11UA:目前比较多的做法还是如下,出于担心未知异常、没有记录日志就退出子线程的情况下,在函数用一个大的 try-except 来进行 handle,或者是将主要逻辑放到 test_sth 中,使用 try-except 来捕获: def run(): try: test_sth() ... except Exception: log_exception…