Python, как обрабатывать пакеты из нескольких потоков?Python

Программы на Python
Anonymous
Python, как обрабатывать пакеты из нескольких потоков?

Сообщение Anonymous »

Я создаю простой веб-сканер на Python. Мне придется просмотреть около 50 тыс. веб-сайтов, и я хочу ускорить этот процесс с помощью многопоточности.

Я определил класс сканера для сканирования каждого веб-сайта как мета-файла. -объект темы:

Код: Выделить всё

Crawler(Thread):
def __init__(self, url, depth, wait):
...
Затем в основной функции я перебираю пакеты по 10 URL-адресов из полного списка URL-адресов и создаю объект Crawler для каждого URL-адреса:

Код: Выделить всё

    for i in range(index, math.ceil(len(urls) / 10)):
jobs = []
for url in urls[i * 10:(i + 1) * 10]:
s = Crawler(url)
s.setDaemon(True)
s.start()
jobs.append(s)

for j in jobs:
j.join()
Проблема в том, что для каждого пакета мне приходится ждать завершения всех потоков. Это неэффективно, поскольку, скажем, у меня есть, скажем, 9 веб-сайтов со 100 страницами и только 1 веб-сайт с 10 000 страниц, 9 веб-сайтов будут готовы за считанные минуты, но мне придется ждать час, пока большой веб-сайт с 10 000 страниц не будет готов. закончить, прежде чем я смогу перейти к следующему пакету.

Чтобы оптимизировать работу, лучше начать с 10 потоков обходчика, а затем каждый раз, когда поток обходчика завершается, создайте нового сканера со следующим URL-адресом в списке, пока список не будет готов.

Я думаю, что можно было бы избавиться от метода join() и использовать цикл while для всей длины threading.enumerate, каждый раз добавляя новый поток длина падает ниже 10, но это звучит немного хакерски.

Я изучал очередь Python, но, судя по примерам на https://docs.python.org/3/library/queue.html, я все равно придется полагаться на .join() и, следовательно, ждать выполнения всех потоков в очереди.

Есть ли способ что-то добавить как «прослушиватель событий» потока, чтобы всякий раз, когда поток завершается, я мог обновить список потоков новым потоком?

Подробнее здесь: https://stackoverflow.com/questions/469 ... le-threads

Вернуться в «Python»