Самый эффективный способ загрузки тысяч веб-страниц - PullRequest
3 голосов
/ 22 февраля 2011

У меня есть несколько тысяч предметов. Для каждого элемента мне нужно загрузить веб-страницу и обработать ее. Сама обработка не требует интенсивной работы процессора.

Сейчас я делаю это синхронно с помощью класса webclient, но это занимает слишком много времени. Я уверен, что это может быть легко парализовано / асинхронизировано. Но я ищу самый ресурсосберегающий способ сделать это. Возможно, существуют некоторые ограничения на количество активных веб-запросов, поэтому мне не нравится идея создания тысяч веб-клиентов и запуска асинхронной операции для каждого из них. Если это не актуальная проблема.

Можно ли использовать класс параллельных расширений и задач в C # 4?

Редактировать: Спасибо за ответы. Я надеялся на что-то, использующее асинхронные операции, потому что выполнение синхронной операции в paralel блокирует только эти потоки.

Ответы [ 3 ]

1 голос
/ 22 февраля 2011

Попробуйте использовать Parallel.ForEach ([список элементов], x => YourDownloadFunction (x))

Он будет автоматически и эффективно обрабатывать параллелизм с использованием пулов потоков и всего лота.

1 голос
/ 22 февраля 2011

Использовать тему.Parallel.ForEach имеет ограниченные потоки, в зависимости от количества ядер / процессоров у вас есть.Выборка веб-сайтов не делает поток полностью активным на протяжении всей его работы.Между запросами будут задержки (изображения, статический контент и т. Д.).Поэтому используйте потоки, чтобы максимизировать скорость.Начните с 50 потоков, затем поднимитесь оттуда, чтобы узнать, сколько может выдержать ваш компьютер.

1 голос
/ 22 февраля 2011

Вы хотите использовать структуру, называемую очередь производителя / потребителя.Вы ставите все свои URL в очередь для обработки и назначаете потоки потребителя для удаления каждого URL (с соответствующей блокировкой), а затем загружаете и обрабатываете его.

Это позволяет вам контролировать и настраивать количество потребителей в зависимости от того, что лучше всего работает в вашей ситуации.В большинстве случаев вы обнаружите, что оптимальная пропускная способность для сетевых операций достигается при 5-20 активных подключениях.Больше, и вы начинаете беспокоиться о проблемах перегрузки на проводе или проблемах переключения контекста между вашими потоками.Конечно, это варьируется в зависимости от ваших обстоятельств: сервер с большим количеством ядер и толстым каналом мог бы поднять это число намного выше, но старый P4 при коммутируемом подключении мог бы найти, что он лучше всего работает с парой, работающей за раз.Вот почему способность настройки так важна.

...