Какой самый быстрый способ отправить 100 000 HTTP-запросов в Python? - PullRequest
228 голосов
/ 13 апреля 2010

Я открываю файл с 100 000 URL. Мне нужно отправить HTTP-запрос на каждый URL и распечатать код состояния. Я использую Python 2.6, и до сих пор смотрел на многие запутанные способы, которыми Python реализует многопоточность / параллелизм. Я даже посмотрел на библиотеку python concurrence , но не могу понять, как правильно написать эту программу. Кто-нибудь сталкивался с подобной проблемой? Я думаю, что в общем мне нужно знать, как выполнить тысячи задач в Python как можно быстрее - я полагаю, это означает «одновременно».

Ответы [ 13 ]

0 голосов
/ 14 апреля 2010

Рассмотрите возможность использования Windmill , хотя Windmill, вероятно, не может сделать столько потоков.

Вы можете сделать это с помощью сценария Python, запущенного вручную, на 5 машинах, каждый из которых соединяется с исходящими портами 40000-60000, открывая 100 000 соединений портов.

Кроме того, это может помочь выполнить пример теста с приложением QA с приятной многопоточностью, таким как OpenSTA , чтобы получить представление о том, сколько может обрабатывать каждый сервер.

Также попробуйте изучить использование простого Perl с классом LWP :: ConnCache. Таким образом, вы получите больше производительности (больше подключений).

0 голосов
/ 13 апреля 2010

В вашем случае многопоточность, вероятно, сработает, так как вы, вероятно, будете тратить большую часть времени на ожидание ответа. В стандартной библиотеке есть полезные модули, такие как Queue , которые могут помочь.

Раньше я делал аналогичные вещи с параллельной загрузкой файлов, и это было достаточно для меня, но не в том масштабе, о котором вы говорите.

Если ваша задача была более привязана к процессору, вы можете обратиться к многопроцессорному модулю, который позволит вам использовать больше процессоров / ядер / потоков (больше процессов, которые не будут блокировать друг друга так как блокировка на процесс)

0 голосов
/ 13 апреля 2010

Самый простой способ - использовать встроенную в Python библиотеку потоков. Они не "настоящие" / потоки ядра У них есть проблемы (например, сериализация), но они достаточно хороши Вы хотите, чтобы очередь и пул потоков. Один вариант - здесь , но написать свой собственный тривиально. Вы не можете распараллелить все 100 000 вызовов, но вы можете запустить 100 (или около того) из них одновременно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...