Scala в примерах: различия между версиями

Содержимое удалено Содержимое добавлено
м «Scala на примерах» переименована в «Scala в примерах»
Нет описания правки
Строка 82:
Сам класс, базируется на модели многопоточности, используемой в нижлежащей платформе (напр. <tt>Java</tt>, Или <tt>.NET</tt>). Расмотрение всех характеристик класса <tt>Actor</tt>, использованного здесь, дано в Разделе 16.11.
 
Далее авторы объясняют, почему выбранная модель IPM не встроена в язык, а представлена в виде библиотеки. Преимущество подобного подхода к многопоточности ''(см. также [http://path_to_srclamp.epfl.ch/~cremet/publications/pilib.pdf PiLib]) '', в относительной простоте основного языка и гибкости для разработчиков. Поскольку в основном языке нет необходимости определять детали высокоуровневой связи процессов, это позволяет сохранять простоту и общность. Поскольку конкретная модель сообщений в почтовом ящике суть - библиотечный модуль, она может свободно быть модифицирована, если это требуется в каких - то приложениях. Для такого подхода необходимо, тем не менее, чтобы базовый язык был достаточно выразителен, чтобы он мог обеспечивать необходимые языковые абстракции удобным способом. Scala разработан с учётом этого требования; одна из основных проектных целей заключалась в том, что Scala должен быть достаточно гибок, как язык - платформа для языков описания областей [[http://ru.wikipedia.org/wiki/%D0%AF%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D1%80%D0%B5%D0%B4%D0%BC%D0%B5%D1%82%D0%BD%D0%BE%D0%B9_%D0%BE%D0%B1%D0%BB%D0%B0%D1%81%D1%82%D0%B8 DSL ]], выполненных как библиотечные модули. Например, представленные выше коммуникации акторов могут рассматриваться как язык описания области, который, в принципе, расширяет ядро Scala.
 
=Глава 4=
Строка 118:
 
 
=Абстракции для многопоточности=
=Abstractions for Concurrency=
 
В этом разделе рассматриваются стандартные паттерны для параллельного программирования и показывается как они могут быть реализованы в Scala. ''"Процесс" и "поток" используются авторами как синонимы, примеры кода приведены без изменений. ''
===Сигналы и мониторы===
===Signals and Monitors===
 
В Scala возможность взаимного исключения потоков обеспечивает монитор. Каждый экземпляр класса AnyRef может быть использован в качестве монитора, посредством вызова одного из этих методов:
Строка 171:
spawn { while (true) { val s = produceString ; buf.put(s) } }
spawn { while (true) { val s = buf.get ; consumeString(s) } }
Метод <tt>spawn</tt> запускает новый поток, который выполняет выражение, переданное параметром. В объекте [http://path_to_apiwww.daimi.au.dk/~eernst/dProgSprog06/share/doc/scala-1.4.0.4/api/scala/concurrent/ops.html scala.concurrent.ops] он определяется следующим образом.
 
def spawn(p: => unit) = {
Строка 177:
t.start()
}
===Синхронизированные переменные===
===<tt>SyncVars</tt>===
Синхронизированная переменная предлагает методы get и put, для чтения и установки переменной. Операции get блокируют поток, пока переменная не определена. Операция unset сбрасывает переменную в неопределенное состояние.
 
Строка 200:
}
}
===<tt>Futures</tt>===
<tt>Future</tt> ''(оставлено без перевода)'' является величиной, которая вычисляется параллельно некоторому потоку, чтобы быть использованной им немного позже. <tt>Future</tt> используется для облегчения параллельной обработки ресурсов. Типичное применение:
import scala.concurrent.ops._
Строка 216:
 
Обратите внимание, что последущие вызовы функции могут возвращать результат немедленно.
===Параллельные вычисления===
===Parallel Computations===
Следующий пример демонстрирует функцию par, которая принимает пару вычислений как параметры и возвращает результаты вычислений в другую пару. Оба вычисления выполняются параллельно.
 
Строка 243:
results
}
===SemaphoresСемафоры===
Классический механизм синхронизации процессов - семафор. Он предлагает два элементарных
действия: занятие и освобождение. Вот реализация простого семафора в Scala:
Строка 258:
}
}
===Читатели/Писатели===
===Readers/Writers===
Более сложная форма синхронизации различает ''читающие потоки'', которые имеют доступ к общему ресурсу, не модифицируя его, и потоки, которые могут и читать, и изменять ресурс - ''писатели ''. Для того, чтобы синхронизировать читателей и писателей, которые нам нужно осуществлять действия startRead, startWrite, endRead, endWrite, при том, что:
 
Строка 288:
}
}
===Асинхронные каналы===
===Asynchronous Channels===
Основной способ межпроцессной связи - асинхронный канал.
Здесь используется следующий простой класс для связанных списков:
Строка 326:
}
}
===Синхронные каналы===
===Synchronous Channels===
 
Вот реализация синхронного канала, где передатчик сообщения блокируется, пока это сообщение не получено. Синхронному каналу необходима единственная переменная, чтобы хранить сообщения для транспорта, и две используются, чтобы координировать процессы чтения и записи.
Строка 353:
}
}
===Сервера вычислений===
===<tt>Workers</tt> ===
 
Реализация сервера вычислений в <tt>Scala</tt>. Сервер выполняет <tt>future</tt> метод, который вычисляет данное выражение параллельно своему вызову. В отличие от реализации в Разделе 16.3, сервер вычисляет <tt>future</tt> только для предопределённого числа потоков. Предполагаемая реализация сервера могла бы запускать каждый поток на отдельном процессоре, что позволило бы избежать усложнений от переключения контекста потока, что характерно для однопроцессорных систем.
Строка 401:
Console.println(f())
}
===Почтовые ящики===
===Mailboxes===
 
Почтовые ящики - это высокоуровневые и гибкие конструкции для синхронизации и взаимодействия процессов.
Строка 519:
 
 
===ActorsАкторы===
В главе 3 представлен набросок электронного аукциона. Этот сервис основывался на высокоуровневых процессах - акторах, которые управляются сообщениями в почтовом ящике, используя сравнение по образцу. Актор является просто потоком, основа коммуникации которого - почтовый ящик. Акторы, следовательно, определяются как mixin композиция расширения класса Thread с классом MailBox.