Если вы пытаетесь использовать многопоточность в 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()
Заключительное примечание: я не компилировал и не тестировал этот код.