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