Стратегии автоматического распараллеливания - PullRequest
1 голос
/ 04 декабря 2010

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

Одной из функций, которые я хотел бы реализовать, является автоматическое распараллеливание , так что, если путь разветвляется, я могу автоматически запустить поток для обработки каждой ветви. Однако меня беспокоит несколько вопросов:

  • Если путь разветвляется, но потом снова объединяется, мне нужно как-то их синхронизировать
  • Если имеется несколько начальных узлов (с которых начинается выполнение), их пути должны управляться отдельно, а затем, возможно, динамически объединяться / объединяться
  • Я хочу ограничить количество создаваемых потоков, чтобы у меня не оказалось 20 заблокированных потоков

По сути, я хотел бы знать, существуют ли какие-либо стратегии для выполнения чего-то подобного (необязательно искать код; просто теория). Могут ли помочь алгоритмы планирования?

Спасибо за ваш совет! Я с нетерпением жду ваших предложений.

Примечание : Я использую C # 3.5, поэтому мне не доступны никакие забавные возможности параллелизма. При необходимости я переключусь на C # 4.0, но я бы хотел этого избежать.

1 Ответ

3 голосов
/ 04 декабря 2010

Библиотека параллельных задач может быть именно тем, что вы ищете.

Я думаю, что ваш редактор на основе узлов перетаскивания выглядит такэто:

Illustration

Каждый узел по сути является Задачей .Задача может быть чем угодно - считывать файл с диска, загружать некоторые данные из Интернета или вычислять что угодно.

Когда задача завершена, она может ContinueWith с одной или несколькими другими задачами., передавая результат старой Задачи новым Задачам.

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

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

Visual Studio Async CTP добавляет поддержку родного языка для асинхронных операций в C #, что делает работу с Задачами действительнопросто и весело.

С TPL это просто вопрос создания Задач и их составления в соответствии с расположением узла.

Полный программный код для приведенного выше примера:

var t1 = Task.Factory.StartNew<int>(() => 42);

var t2a = t1.ContinueWith<int>(t => t.Result + 1);
var t2b = t1.ContinueWith<int>(t => t.Result + 1);

var t3a = t2a.ContinueWith<int>(t => t.Result * 2);
var t3b = t2b.ContinueWith<int>(t => t.Result * 3);

var t4 = TaskEx.WhenAll<int>(t3a, t3b)
               .ContinueWith<int>(t => t.Result[0] + t.Result[1]);

t4.ContinueWith(t => { Console.WriteLine(t.Result); });

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