Если работаем с сетью, то можно выбрать побольше: 20, 40, 100
Если с файловой системой, то так не сработает, мы только забьем ресурсы и будет еще медленнее работать. Оптимально выбрать количество ядер помноженное на 2.
multithreading
Многопоточное выполнение над локальными процессами (например, над файловой системой)
Пример:
import osimport itertools# Глубоко под копотом Pool из threading то же самое, что и Pool из multiprocessing.poolfrom multiprocessing.dummy import Pool as ThreadPoolpool =ThreadPool(os.cpu_count() *2)results_iterator = pool.imap_unordered(do_something, some_iterator)pool.close()
import requestsfrom pathlib import Pathfrom queue import Queue, Empty as QueueEmptyfrom threading import Threadfrom multiprocessing.dummy import Pool as ThreadPoolfrom contextlib import suppressdefreadFile(path: Path): res = []with path.open(mode='r')as stream: line = stream.readline()while line: line = line.replace('\n', '') res.append(line) line = stream.readline()return resusernames =readFile(Path('/wordlists/YAWR/usernames/usernames-shortlist.txt'))passwords =readFile(Path('/wordlists/russkiwlst/russkiwlst_top_100k.lst'))"""Забираем из creds креды и добавляем в очередь запросов"""defadd2queue(*, creds_queue,tasks_queue):whileTrue: creds = creds_queue.get()# print("Test") tasks_queue.put(creds)"""Делаем запрос или что угодно с нашими данными"""defrequest(creds): username, password = credsprint(f'username: {username}, password: {password}')"""Организуем очередь"""defstart():print("Start") creds_queue =Queue()""" Забираем данные, кладем в очередь """for user in usernames:for pswd in passwords: creds_queue.put((user, pswd))print("Creds loaded")""" Очередь тасков ограниченная """ tasks_queue =Queue(maxsize=100)defiterate_tasks():withsuppress(QueueEmpty):whileTrue:yield tasks_queue.get()""" Перегоняем креды в очередь на исполнение """Thread(target=lambda: add2queue( creds_queue=creds_queue, tasks_queue=tasks_queue )).start()# for task in iterate_tasks():# print(task) pool =ThreadPool(20)# количестов потоков out = pool.imap(request, iterate_tasks(), chunksize=5)print("Stop")if__name__=='__main__':start()
Timer
Выполняем задачу периодически, пока не вернется нужный результат: