Как я могу использовать параллельные потоки, чтобы ускорить работу? - PullRequest
1 голос
/ 08 мая 2020
• 1000 потоков, как я могу это реализовать?

Я много раз спрашивал Google, но ничего не вижу по этому поводу, может кто-нибудь привести мне пример?

gobuster usage: -t Number of concurrent threads (default 10)

Моя текущая программа:

def subdomaines(url, wordlist):
    checks(url, wordlist) # just checking for valid args
    num_lines = get_line_count(wordlist) # number of lines in a file
    count = 0
    for line in open(wordlist).readlines():
        resp = requests.get(url + line) # resp
        if resp.status_code in (301, 200):
            print(f'Valid - {line}')
        print(f'{count} / {num_lines}')
        count += 1

Примечание *: gobuster - очень быстрый инструмент для поиска субдоменов на веб-сайтах

Ответы [ 2 ]

0 голосов
/ 08 мая 2020

Если вы пытаетесь использовать многопоточность в python, вам следует начать с основ и узнать, что доступно. Но вот простой пример, взятый из https://pymotw.com/2/threading/

import threading

def worker():
    """thread worker function"""
    print 'Worker'
    return

threads = []
for i in range(5):
    t = threading.Thread(target=worker)
    threads.append(t)
    t.start()

Чтобы применить это к вашей задаче, простым подходом было бы создать поток для каждого запроса. Что-то вроде кода ниже. Примечание: если у вас длинный список слов, это может быть очень дорого. Изучите некоторые библиотеки пула потоков в python, чтобы лучше управлять потоками, которые вам не нужно явно контролировать самостоятельно.

import threading

def subdomains(url, wordlist):
    checks(url, wordlist) # just checking for valid args
    num_lines = get_line_count(wordlist) # number of lines in a file
    count = 0
    threads = []
    for line in open(wordlist).readlines():
        t = threading.Thread(target=checkUrl,args=(url,line))
        threads.append(t)
        t.start()
    for thread in threads:  #wait for all threads to complete
       thread.join()


 def checkUrl(url,line):
    resp = requests.get(url + line) 
    if resp.status_code in (301, 200):
          print(f'Valid - {line}')

Чтобы реализовать счетчик, вам необходимо управлять общим доступом между потоками для предотвращения состояния гонки (два потока одновременно обращаются к переменной, что приводит к ... проблемам). Объект счетчика с защищенным доступом предоставлен по ссылке выше:

class Counter(object):
    def __init__(self, start=0):
        self.lock = threading.Lock()
        self.value = start
    def increment(self):
        #Waiting for lock
        self.lock.acquire()
        try:
            #Acquired lock
            self.value = self.value + 1
        finally:
            #Release lock, so other threads can count
            self.lock.release()

#usage:

#in subdomains()...
  counter = Counter()
  for ...
     t = threading.Thread(target=checkUrl,args=(url,line,counter))


#in checkUrl()...
  c.increment()

Заключительное примечание: я не компилировал и не тестировал этот код.

0 голосов
/ 08 мая 2020

Python иметь модуль threading .

Самый простой способ использовать поток - создать его экземпляр с целевой функцией и вызвать start (), чтобы он начал работать.

import threading

def subdomains(url, wordlist):
    checks(url, wordlist) # just checking for valid args
    num_lines = get_line_count(wordlist) # number of lines in a file
    count = 0
    for line in open(wordlist).readlines():
        resp = requests.get(url + line) # resp
        if resp.status_code in (301, 200):
            print(f'Valid - {line}')
        print(f'{count} / {num_lines}')
        count += 1

threads = []
for i in range(10):
    t = threading.Thread(target=subdomains)
    threads.append(t)
    t.start()
...