2013-06-22 6 views
2

Я пытаюсь посетить веб-страницы и проверить, если владелец веб-сайта позволяет связаться с ним или нет ..использования памяти Thread продолжает расти

Вот 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

Вы пытались помещать их в 'queue.Queue' и запускать только 100 потоков? Или запустив max 100 потоков, а затем начиная с 'join()' – User

+0

не пробовали Queue .. если я использую объединение в функции, программа ждет, пока все потоки не будут завершены, что займет гораздо больше времени. – 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