Из того, что я вижу, вы запускаете поток, чтобы получить каждый URL в исходном списке, просмотреть его и добавить найденные URL в исходный список.
Проблема в том, что все это происходити сопоставление занимает некоторое время, и цикл, который запускает потоки, вероятно, будет выполнен задолго до того, как будут добавлены первые новые URL.После этого он больше не просматривает список, поэтому новые URL-адреса не будут обрабатываться.
Для справки, вам действительно нужна синхронизация и сигнализация.Большинство языков делают это, используя мьютексы, «условия» или семафоры.Пока вы делаете что-то подобное, вам, в основном, придется запускать цикл while снова и снова после присоединения к каждой партии потоков из предыдущего цикла while.
На самом деле ...
Просматривая документы, я нахожу this :
Начиная с 5.6.0, Perl поддерживаетновый тип потоков, называемый потоками интерпретатора (ithreads).Эти потоки могут использоваться явно и неявно.
Ithreads работает путем клонирования дерева данных, чтобы данные не передавались между разными потоками.
Хорошие новости / плохие новости.Хорошей новостью является то, что вам не нужно беспокоиться о поточно-ориентированном доступе к @urls
, как он появился впервые.Причиной тому являются плохие новости: каждый поток имеет свой @urls
, поэтому вы не можете таким образом обмениваться данными без какой-либо дополнительной помощи.
Вместо этого вы, вероятно, захотите сделать следующее:создайте поток в контексте списка, и пусть он возвращает список найденных URL-адресов, которые затем можно добавить к @urls, когда вы join
поток.Альтернатива (совместное использование @urls
между потоками) может быть ужасно быстрой, если вы не знаете о проблемах безопасности потоков.
Однако, если вы сделаете это, сценарий поглотит огромное количестворесурсы - только три тестовых URL содержали 42 других URL-адреса, и многие из них, вероятно, имеют собственные URL-адреса.Поэтому, если вы собираетесь запускать один поток на запрос, вы очень быстро создадите больше потоков, чем может справиться практически любая машина.