Python: выполнить несколько запросов параллельно и завершить первый - PullRequest
5 голосов
/ 01 июля 2011

Я пытаюсь создать скрипт Python, который выполняет запросы к нескольким сайтам.Скрипт работает хорошо (я использую urllib2), но только для одной ссылки.Для сайтов с несколькими сайтами я делаю несколько запросов один за другим, но это не очень мощно.

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

Я нашел этот вопрос, но я не нашел, как изменить его, чтобы остановить остальные потоки ...: Python urllib2.urlopen () работает медленно, нужен лучший способ чтениянесколько URL

Заранее спасибо!

(извините, если я допустил ошибки на английском, я французский ^^)

Ответы [ 3 ]

2 голосов
/ 01 июля 2011

Вы можете использовать Twisted для одновременной обработки нескольких запросов.Внутренне он будет использовать epoll (или iocp или kqueue в зависимости от платформы) для эффективного уведомления о доступности tcp, что дешевле, чем использование потоков.Как только один запрос соответствует, вы отменяете другие.

Вот учебное руководство по Twisted http agent .

0 голосов
/ 01 июля 2011

Вы можете выполнять свои запросы с помощью библиотеки multiprocessing, опроса результатов и запросов на отключение, которые вам больше не нужны. Документация для модуля содержит информацию о классе Process , который имеет метод terminate () .Если вы хотите ограничить количество отправленных запросов, проверьте параметры для объединения.

0 голосов
/ 01 июля 2011

Обычно это реализуется по следующей схеме (извините, мои навыки Python не так хороши).

У вас есть класс с именем Runner. Этот класс имеет давно работающий метод, который получает необходимую вам информацию. Кроме того, он имеет метод Cancel, который каким-то образом прерывает длительный метод (можно сделать объект запроса url полем члена класса, поэтому класс отмены вызывает эквивалент request.terminate ()).

Длительному методу необходимо принять функцию обратного вызова, которая будет сигнализировать о завершении.

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

И в методе обратного вызова вы просто просматриваете список всех потоковых классов и вызываете их метод отмены.

Пожалуйста, отредактируйте мой ответ в любой конкретной реализации Python:)

...