Многопоточная качалка на Perl

Nov 16, 2016 13:32


в FB ленте увидел пост zamotivator про то, как он делал своё же тестовое задание - многопоточный загрузчик. Я такие штучки люблю, и сделал свой https://github.com/onokhov/crawler/blob/master/crawler.pl. Естественно на Perl.

Для этой задачки было бы достаточно параллельных коннектов, сделанных с AnyEvent::HTTP. Но параллельность там не совсем настоящая, потому как читать ответы, парсить их и записывать в файлы всё равно пришлось бы в один поток. Да и скучно было бы писать программу, основная часть которой уже написана в мануале по AnyEvent. Поэтому я решил реализовать параллельность форками.

AnyEvent остался для того, чтобы раздавать задания в дочерние процессы, а загрузка, разбор и сохранение в файл -- это всё уже параллельно для каждого каждого загружаемого урла. Такая схема может быть полезна для рекурсивных задач, требующих вычислительной мощности.

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

Скрипт ни в коей мере не предназначен для замены wget, это просто программистская разминка.

perl

Previous post Next post
Up