- Joins (библиотека)
-
Joins — асинхронный API для параллельных вычислений, разработанный Microsoft Research для .NET Framework. Библиотека основана на соединительном исчислении и делает конструкции параллелизма языка Cω доступными в качестве .NET-сборки любому языку с поддержкой CLI.
Содержание
Обзор
Joins может быть использована для описания параллелизма в приложении, использующем шаблоны joins, что подходит как для многопоточных приложений, так и распределённых приложений, основанных на событиях. API библиотеки Joins эмулирует декларативное типобезопасное описание шаблонов синхронизации.
Библиотека Joins эмулирует асинхронные и синхронные методы. Асинхронный метод, с точки зрения Cω и Joins, это метод, который не блокирует вызвавший его метод и не возвращает ему результатов своей работы, тогда как синхронный метод блокирует вызвавший его метод. В API Joins синхронные и асинхронные методы реализованы как обобщённые делегаты. Использование обощений гарантирует безопасность типов. Например, можно создать набор из синхронных и асинхронных методов и использовать их для создания объекта, реализующего шаблон:
public class JoinDemo { public readonly Asynchronous.Channel<int> Queue; public readonly Asynchronous.Channel<string> Send; public readonly Synchronous<int>.Channel Retrieve; private Join joinPattern = Join.create(); public JoinDemo() { joinPattern.Initialize(out Queue); joinPattern.Initialize(out Send); joinPattern.Initialize(out Retrieve); } }
При вызове асинхронных методов параметры передаются в канал, представляющий собой очередь, управляемую средой исполнения Joins. Помимо этого, метод может запустить новый поток для обработки параметров в качестве фоновой задачи и вернуть результаты. При вызове соответствующего синхронного метода параметр возвращается для дальнейшей обработки. Если при вызове синхронного метода в очереди нет ни одного параметра, то вызывающий ждёт. Среда исполнения Joins планирует возврат параметра исходя из его готовности.
Синхронизирующий шаблон методов определяется joins-шаблонами (шаблонами соединений), которые описывают, что произойдет при задействовании набора каналов. Например, что произойдет когда Send и Retrieve будут вызваны вместе, а что — при вызове Send и Queue.
public void SetPatterns() { join.When(Send).And(Retrieve).Do(delegate (string s) { return s; }); join.When(Queue).And(Retrieve).Do(delegate (int n) { return n.ToString(); }); join.When(Send).And(Queue).And(Retrieve).Do(delegate (string s) { Send(s); return Retrieve(); }; }
Недостатки
Главным недостатком библиотеки Joins является скорость, поэтому, например, в Cω предусмотрено больше возможностей для оптимизации за счет статического подхода[1].
Примечания
- ↑ The Joins Concurrency Library (англ.)
Ссылки
- Joins — A Concurrency Library (англ.) (дистрибутив)
- The Joins Concurrency Library (англ.) (лекция)
- Joins — A Concurrency Library (англ.) (описание)
Категории:- Библиотеки параллельного программирования
- Microsoft Research
Wikimedia Foundation. 2010.