线程内存使用量不断增加

时间:2013-06-22 15:25:19

标签: python multithreading memory

我正在尝试访问网页并检查网站所有者是否允许与他联系..

这是http://pastebin.com/12rLXQaz

这是每个线程调用的函数:

def getpage():
    try:
        curl = urls.pop(0)
        print "working on " +str(curl)
        thepage1 = requests.get(curl).text
        global ctot
        if "Contact Us" in thepage1:
            slist.write("\n" +curl)
            ctot = ctot + 1
    except:
        pass
    finally:
        if len(urls)>0 :
            getpage()  

但事情是程序的记忆不断增加..(pythonw.exe)

当线程再次调用该函数时,条件为真..程序的内存应至少保持在同一级别。

对于包含大约100k URL的列表,该程序占用的内容远远超过3GB并且正在增加......

2 个答案:

答案 0 :(得分:3)

您的程序无缘无故递归。递归意味着对于每个页面,您可以创建一组新的变量,并且因为这些变量仍然被函数中的局部变量引用,因为函数永远不会结束,所以垃圾收集永远不会发挥作用,它将继续永远地吃着记忆。

阅读while语句,这是你想要使用的语句而不是递归。

while len(urls)>0 :
    try:
        curl = urls.pop(0)
        thepage1 = requests.get(curl).text
        global ctot
        if "Contact Us" in thepage1:
            slist.write("\n" +curl)
            ctot = ctot + 1
    except:
        pass

答案 1 :(得分:-1)

我查看了您的代码:http://pastebin.com/J4Rd3NhA

我会在100个线程运行时使用join:

for xd in range(0,noofthreads):
    t = threading.Thread(target=getpage)
    t.daemon = True
    t.start()
    tarray.append(t)
    # my additional code
    if len(tarray) >= 100:
        tarray[-100].join()

这是如何表现的?如果出现问题,请告诉我。