zoukankan      html  css  js  c++  java
  • pycURL的内存问题

    pycURL的内存问题

    最近用pycURL写了一个工具,注册账号用的。写是写好了,但是发现内存占用超大。40个线程运行一天跑到了3.7G的内存。

    于是着手调查这个问题。

    调查方法就是用python的gc啦。

    关于python gc的特性神马的我就不赘述了,google都能搜到一大坨。

    最后是发现pycURL的使用中的一个地方导致了循环引用,再加上我写了析构方法,于是就杯具了。。

    def __init__(self):

       ...

       self._crawler       = pycurl.Curl()

       ...

       self._crawler.setopt(pycurl.WRITEFUNCTION, self._get_res)

       ...

    def __del__(self):

       self._crawler.close()

    def _get_res(self, data):

       self._response += data

    就是这样。。于是就好了。。这个类引用的pycurl.Curl对象,pycurl.Curl对象又引用了这个类里的_get_res方法。。。

    破解这个循环也不是很方便就可以的,最后还是用了在perform前指定局部变量

    def visit(self, ...):

        b = StringIO.StringIO()

        self._crawler.setopt(pycurl.WRITEFUNCTION, b.write)

        ...

        self._crawler.perform()

        self._response = b.getvalue()

        ...

    -.-

    比较一下

      PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
    13020 huang.sh  15   0 5821m 3.7g 4784 S  0.0 47.3   3:22.22 /usr/local/bin/python2.6 -O -m captcha.regmachine.register

    上面是优化前的运行状况,40线程

    下面是优化后的运行状况,50线程

      PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
    21702 huang.sh  15   0  953m 112m 4776 S  0.0  1.4   3:34.11 /usr/local/bin/python2.6 -O -m captcha.regmachine.register

     
  • 相关阅读:
    常见协议及默认的端口号
    超级简单的防止表单重复提交
    Spring的IOC和AOP的作用
    通向财富自由之路一
    AngularJS2.0的特性
    Charles设置断点
    JMeter参数化之csv data set config常见的错误
    Jmeter的几种参数化方式
    java中关于String对象的解析
    题目2:数组中重复的数字
  • 原文地址:https://www.cnblogs.com/timssd/p/5448021.html
Copyright © 2011-2022 走看看