2

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

这是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)

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

对于包含大约 10 万个 URL 的列表,该程序占用的空间远远超过 3GB 并且还在增加……

4

2 回答 2

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
于 2013-06-22T16:17:43.963 回答
-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()

这表现如何?如果有什么问题,请告诉我。

于 2013-06-22T15:50:10.493 回答