2013-06-22 42 views
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)

由于线程再次调用函数的合作ndition是真的..程序的内存至少应保持在大致相同的水平。

对于含有100K左右的网址,该方案正在为3GB更和增加列表...

+0

您是否尝试过把它们放入一个'queue.Queue'只有启动100个线程?或者开始最多100个线程,然后开始'join()' – User

+0

还没有尝试Queue ..如果我在函数中使用join,程序将等待所有线程完成,这会花费更多的时间 – user2511798

+0

1.尝试包含相关在你的问题中你的代码的位。 2.你的代码不起作用,“NameError:name'tarray'未定义”。 –

回答

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 
+0

谢谢..一个伪代码将不胜感激:)我从来没有这样做过。 – user2511798

+0

@ user2511798:这对于伪代码来说太简单了。 –

-1

我看看你的代码:http://pastebin.com/J4Rd3NhA

我会用加入而100个线程运行:

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() 

这是如何执行的?如果有什么不对,告诉我。

+0

noofthreads = 100同样的事情发生..(内存逐渐增加) – user2511798

相关问题