我正在尝试访问网页并检查网站所有者是否允许与他联系..
这是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并且正在增加......
答案 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()
这是如何表现的?如果出现问题,请告诉我。