CCR Microsoft против параллельной библиотеки задач - PullRequest
6 голосов
/ 15 апреля 2009

У Microsoft есть как минимум два разных подхода к улучшенной поддержке одновременных операций.

1) Является ли среда параллельной координации (CCR), которая является частью Microsoft Robotics Studio и CCR & DSS Toolkit

2) Task Paralell Library ( TPL ) (часть .NET 4.0 и теперь в бета-версии 1)

Я хотел бы знать, имеет ли кто-нибудь опыт работы с этими двумя различными программными средствами и сравнивал бы их и сравнивал?

Ответы [ 2 ]

9 голосов
/ 21 апреля 2009

По большому счету обе системы имеют взаимодополняющие, но разные цели.

CCR предлагает примитивы для координации параллельных процессов. Координация является связующим звеном, которое заставляет работать кучу процессов в целом - поэтому CCR предлагает примитивы для обмена сообщениями по так называемым каналам. Процессы могут ожидать поступления сообщения по каналу или по нескольким каналам или по любому из нескольких каналов и так далее. Это особая парадигма для координации параллельных процессов, которая работает хорошо. Обратите внимание, что это не бесплатно - вы должны купить, если у Microsoft отдельно.

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

Итак, если у вас есть куча процессов, которые вы хотите координировать на более высоком уровне, чем при использовании общего состояния и блокировок, используйте CCR. Если у вас интенсивный вычислительный процесс, который вы хотите эффективно выполнять на многоядерном компьютере, используйте TPL.

5 голосов
/ 21 октября 2010

Это не или / или сценарий. CCR - это библиотека, которая поддерживает определенные шаблоны программирования. Вы можете смешивать код CCR и TPL следующим образом, вот Parallel.For внутри делегата приема:

using System;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Ccr.Core;

namespace Demo
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Dispatcher dispatcher = new Dispatcher();
            DispatcherQueue taskQueue = new DispatcherQueue("Demo", dispatcher);
            Port<int> portInt = new Port<int>();
            portInt.Post(Int32.Parse(args[0]));

            Arbiter.Activate(
                taskQueue,
                portInt.Receive(delegate(int count)
                {
                    Parallel.For(0, count, i =>
                    {
                        Console.Write(i.ToString() + " ");
                    });
                }
            ));
        }
    }
}
...