Можно ли использовать параллелизм потоков и параллелизм вместе? - PullRequest
2 голосов
/ 05 марта 2011

Для одного из моих проектов, такого как агрегатор контента, я хотел бы представить параллелизм и, если возможно, параллелизм.На первый взгляд это может показаться бессмысленным, поскольку параллелизм и параллелизм используют разные подходы.(Параллелизм через потоки вводит непосредственный параллелизм, где параллелизм предоставляет потенциал).

Итак, чтобы лучше объяснить мою проблему, позвольте мне обобщить мой набор проблем.

Поскольку мой проект является агрегатором контента(который объединяет каналы, подкасты и тому подобное), он в основном считывает данные из Интернета, анализирует их, чтобы получить значимые данные.

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

foreach(feed in feeds)
{
   read_from_web(feed)
   parse(feed)
}

Таким образом, при последовательном подходе время анализа всех фидов и их обработки во многом зависит не только от кода парсера, но и от времени, необходимого для полученияXML-источник из Интернета.Все мы знаем, что может потребоваться переменное время, чтобы прочитать исходный текст из Интернета (из-за сетевых условий и подобных проблем).

Таким образом, чтобы ускорить код, я могу использовать подход рабочих потоков, который представитнемедленный параллелизм;

concurrency

Таким образом, определенное количество рабочих потоков может одновременно обрабатывать и анализировать подачу (что наверняка ускорит весь процесс - как мы увидим далее)меньшее влияние ожидания данных по сети).

Это нормально, пока моя целевая аудитория проекта не использует многоядерные процессоры - из-за того, что они геймеры --.

Я также хочу использовать эти ядра при обработке контента, поэтому начал читать о потенциальном параллелизме http://oreilly.com/catalog/0790145310262. Я еще не закончил читать его и не знаю, если это ужеобсуждает, но я довольно одержим этим и хотел бы спросить о стековом потоке, чтобы получить общее представление.

Так как книга описывает мощныйПараллелизм ial: потенциальный параллелизм означает, что ваша программа написана так, что она работает быстрее , когда доступно параллельное аппаратное обеспечение и примерно то же самое как эквивалентная последовательная программа когда это не .

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

Ответы [ 2 ]

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

Я думаю, что более полезно думать о работе, связанной с IO и процессором;темы могут помочь с обоими.

Для работы, связанной с вводом-выводом, вы, вероятно, ожидаете внешних ресурсов (в вашем случае, каналов для чтения).Если вам нужно ждать на нескольких внешних ресурсах, то имеет смысл только ожидать их параллельно, а не ждать один за другим.Лучше всего это сделать, раскрутив потоки, которые блокируют ввод-вывод.

Для работы с ЦП вы хотите использовать все свои ядра, чтобы максимизировать пропускную способность выполнения этой работы.Для этого вы должны создать пул рабочих потоков примерно того же размера, что и количество ядер, и разбить их и распределить работу между ними.[То, как вы разбиваете и распределяете работу, само по себе является интересной проблемой.]

На практике я обнаружил, что большинство приложений имеют обе эти проблемы, и имеет смысл использовать потоки для решения обоих видов проблем.1007 *

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

Ладно, похоже, я сильно ошибся описанием книг о возможном параллелизме.Благодаря ответам я смог разобраться:

Из MSDN: http://msdn.microsoft.com/en-us/library/dd460717(VS.100).aspx

Параллельная библиотека задач (TPL) - это набор открытых типов и API в Системе.Пространства имен .Threading и System.Threading.Tasks в .NET Framework версии 4. Целью TPL является повышение производительности труда разработчиков за счет упрощения процесса добавления параллелизма и параллелизма в приложения.TPL динамически масштабирует степень параллелизма, чтобы наиболее эффективно использовать все доступные процессоры.Кроме того, TPL обрабатывает разделение работы, планирование потоков в ThreadPool, поддержку отмены, управление состоянием и другие подробности низкого уровня.Используя TPL, вы можете максимизировать производительность своего кода, сосредоточившись на работе, для которой предназначена ваша программа.

Таким образом, в основном это означает, что TPL может обрабатывать все детали параллелизма с помощью потоков, а такжеподдерживает параллелизм на многоядерных процессорах.

...