Хороший подход к решению этой проблемы заключается в том, чтобы сначала написать код, необходимый для получения одного результата, а затем включить многопоточный код для распараллеливания приложения.
В идеальном мире это просто означало бы одновременный запуск 100 000 потоков, которые выводят свои результаты в словарь или список для последующей обработки, но на практике вы ограничены в количестве параллельных HTTP-запросов, которые вы можете выполнить таким способом. Локально, у вас есть ограничения на количество сокетов, которые вы можете открывать одновременно, сколько потоков исполнения допускает ваш интерпретатор Python. Удаленно, вы можете быть ограничены в количестве одновременных подключений, если все запросы направлены к одному серверу или ко многим. Эти ограничения, вероятно, потребуют от вас написания сценария таким образом, чтобы опрашивать только небольшую часть URL-адресов одновременно (100, как упоминалось в другом постере, вероятно, является приличным размером пула потоков, хотя вы можете обнаружить, что вы может успешно развернуть еще много).
Вы можете использовать этот шаблон проектирования для решения вышеуказанной проблемы:
- Запустите поток, который запускает новые потоки запросов, пока число текущих запущенных потоков (вы можете отслеживать их с помощью threading.active_count () или путем помещения объектов потока в структуру данных) не будет> = вашего максимального количества одновременных запросов (скажем, 100) затем спит в течение короткого перерыва. Этот поток должен завершиться, когда больше нет URL-адресов для обработки. Таким образом, поток будет продолжать просыпаться, запускать новые потоки и спать до тех пор, пока вы не закончите.
- Пусть потоки запроса сохранят свои результаты в некоторой структуре данных для последующего поиска и вывода. Если структура, в которой вы сохраняете результаты, представляет собой
list
или dict
в CPython, вы можете безопасно добавлять или вставлять уникальные элементы из ваших потоков без блокировок , но если вы записываете в файл или требуете более сложного взаимодействия данных между потоками, вам следует использовать блокировка взаимного исключения для защиты этого государства от коррупции .
Я хотел бы предложить вам использовать модуль потоков . Вы можете использовать его для запуска и отслеживания запущенных потоков. Поддержка потоков в Python отсутствует, но описание вашей проблемы предполагает, что ее вполне достаточно для ваших нужд.
И, наконец, если вы хотите , чтобы увидеть довольно просто приложение параллельного сетевого приложения , написанного в Python, проверить ssh.py . Это небольшая библиотека, которая использует потоки Python для распараллеливания многих SSH-соединений. Дизайн достаточно близок к вашим требованиям, поэтому вы можете найти его хорошим ресурсом.