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…