Баланс между количеством потоков и веб-запросов - PullRequest
1 голос
/ 05 марта 2012

У меня есть программа, которая выполняет несколько потоков. Каждый поток просто выполняет HTTPWebRequest, а затем просматривает страницу в поисках некоторого текста. Я участвую в гонке против других пользователей, чтобы найти этот текст. Я мог бы выполнить 1000000 потоков, все искали одно и то же.

Я думал о том, что это потребует много работы на моем процессоре и фактически заставит запросы выполняться медленнее. Как мне найти баланс между количеством выполняемых потоков и производительностью веб-запросов. По сути, я хочу найти оптимальное количество потоков, которые будут порождаться, чтобы объем данных, которые они извлекали, был максимальным.

Приложение использует .NET4 и написано на C #.

Ответы [ 4 ]

1 голос
/ 05 марта 2012

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

Очевидно, вы не серьезно относитесь к 1000000 потокам, но это демонстрирует, что вы не можете просто добавить больше потоков для решения проблемы. Вы действительно не хотите писать свой собственный балансировщик нагрузки - это будет непросто и не будет работать так же хорошо, как классы, поставляемые с библиотекой базовых классов. Обратите внимание на использование потоков ThreadPool - CLR будет управлять ими за вас. Вы также можете взглянуть на библиотеку параллельных задач, которая появилась в .NET 4.0 (поскольку вы упоминаете, что это то, что вы используете).

Также ознакомьтесь с этой замечательной статьей о многопоточности:

http://www.albahari.com/threading/

1 голос
/ 05 марта 2012

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

Огромное количество потоков бесполезно, как пишет @M Babcock.

Я не уверен, можно ли изменить количество потоков в C # ThreadPool во время выполнения (я не вижу причин, почему нет, но M $ ...). Если его можно настроить во время работы, настройка будет еще проще!

0 голосов
/ 05 марта 2012

Вы задаете вопрос о производительности и не предоставляете никаких оценок ваших реальных потребностей ... поэтому позвольте мне попробовать сделать это для вас.

Сколько данных вы можете извлечь - при условии, что у вас замечательная сеть и обычная сетевая карта - максимум 100 Мбит / с, вероятно, менее 10 Мбит / с. Это дает примерно менее 10000 запросов в секунду (при условии ~ 10K пар запросов / ответов).

Может ли один поток обрабатывать такое количество данных - поиск по 100 МБ в секунду не должен быть проблемой даже для одного потока. Супер прост в прототипе / измерения.

Сколько потоков мне нужно для чтения данных - вероятно, 1 - быстрый запуск асинхронного запроса, чтение ответа ИЛИ отправка ответа в очередь для обработки выполняется быстро со скоростью 10000 элементов в секунду.

Итак, мои оценки - 1 поток для простого кода (1 + один поток на ядро), если у вас больше ядер и вы хотите параллельно выполнять обработку.

0 голосов
/ 05 марта 2012

вам нужно использовать Parallel.Foreach для правильного управления вашими потоками ...

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