Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 29, 2009 10:07:28

Ghost2008
От:
Зарегистрирован: 2009-11-29
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Управление памятью при работе с потоками

Написал небольшой скрипт, который ищет открытые директории в корне сайта:

class CheckingThread ( threading.Thread ):
def __init__ ( self, length ):
# length - the length of the strings being checked
threading.Thread.__init__ ( self )
self.length = length

def run ( self ):
ml = ('abcdefghijklmnopqrstuvwxyz')
stra = ""
self.genstr(stra, 0, self.length, ml, 0, self.isdir)

def isdir( self, patha ):
global fileh
path = "http://www.site.com/" + patha + "/"

site = urlopen(path).read()

if(site.startswith("<!DOCTYPE HTML PUBLIC \"-//W")):
print path + "\t\t => Exists"
fileh.write(path + "\n")
else:
print path + "\t\t => -"

def genstr( self, stra, k, n, a, count, fun ):
# Generates all possible strings of n length out of the given
# list of symbols (a) and passes each of them to function fun
#print a
if(k<n):
for i in a:
if(len(stra) == k):
stra += i
else:
stra = stra[:-1] + i
count = self.genstr(stra, k+1, n, a, count, fun)
return count
else:
fun(stra)
return count + 1

fileh = open("ahaha.txt", 'w')

for x in xrange ( 13 ):
z = x + 3
CheckingThread ( z ).start()
fileh.close()
Вроде бы все должно быть нормально: запускаются 13 потоков, каждый из которых параллельно выполняет проверку всех возможных вариантов имен директорий. Но через некоторое время скрипт выпадает с ошибкой Memory Error Exception. Насколько я понимаю, не хватает памяти.

Проверка сделана не очень продуманно, так как скрипт заточен под конкретный сайт.

Вопрос - почему так происходит и как с этим бороться?



Офлайн

#2 Ноя. 29, 2009 14:36:48

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

Управление памятью при работе с потоками

Ну, наверное 13 потоков наверное все таки много памяти кушают, когда запущены все одновременно и, особенно, когда используется рекурсия :)
Я бы использовал try…except и вывел stack traceback при возникновении ошибки, чтобы понять в каком месте она возникает.

Кроме того, использовать 1 файл для записи из разных потоков - не самая лучшая идея.

А зачем вам открытые директории чужих сайтов?



Офлайн

#3 Ноя. 29, 2009 15:04:53

Ghost2008
От:
Зарегистрирован: 2009-11-29
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Управление памятью при работе с потоками

Я только начал работать с потоками, поэтому еще плохо представляю, как они работают, сколько ресурсов едят и как их определять :) Спасибо за ссылку, сейчас буду читать и пробовать. Пока что интерпретатор выдает в stack traceback, что ошибка вылетает при попытке открытия url в одном из потоков.

Какое количество потоков можно считать оптимальным? Например, для моей задачи.

Как лучше организовать работу с файлами при использовании потоков?

Идея скрипта возникла, когда я у знакомого на сайт зашел и решил проверить дырки. Самой большой дырой оказались некоторые открытые системные директории. Захотелось найти все, чтобы сразу ему на них указать (и заодно прибавить трафика, пусть и с одного IP). Но написание простого скрипта несколько затянулось… стало интересно разобраться с потоками.



Отредактировано (Ноя. 29, 2009 15:05:14)

Офлайн

#4 Ноя. 29, 2009 21:07:49

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

Управление памятью при работе с потоками

Ghost2008
Какое количество потоков можно считать оптимальным? Например, для моей задачи.
Подбирать экспериментально.

Ghost2008
Как лучше организовать работу с файлами при использовании потоков?
В данном случае можно использовать Queue или Lock.

Ghost2008
Идея скрипта возникла, когда я у знакомого на сайт зашел и решил проверить дырки. Самой большой дырой оказались некоторые открытые системные директории.
Только не забывайте, что благими намерениями можно и навредить. Так, например, одним из этапов подготовки нападения на сайт хакеров есть как раз проверка доступных извне ресурсов.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version