Scala в примерах: различия между версиями
Содержимое удалено Содержимое добавлено
Ramir (обсуждение | вклад) м «Scala на примерах» переименована в «Scala в примерах» |
Нет описания правки |
||
Строка 82:
Сам класс, базируется на модели многопоточности, используемой в нижлежащей платформе (напр. <tt>Java</tt>, Или <tt>.NET</tt>). Расмотрение всех характеристик класса <tt>Actor</tt>, использованного здесь, дано в Разделе 16.11.
Далее авторы объясняют, почему выбранная модель IPM не встроена в язык, а представлена в виде библиотеки. Преимущество подобного подхода к многопоточности ''(см. также [http://
=Глава 4=
Строка 118:
=Абстракции для многопоточности=
В этом разделе рассматриваются стандартные паттерны для параллельного программирования и показывается как они могут быть реализованы в Scala. ''"Процесс" и "поток" используются авторами как синонимы, примеры кода приведены без изменений. ''
===Сигналы и мониторы===
В 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://
def spawn(p: => unit) = {
Строка 177:
t.start()
}
===Синхронизированные переменные===
Синхронизированная переменная предлагает методы get и put, для чтения и установки переменной. Операции get блокируют поток, пока переменная не определена. Операция unset сбрасывает переменную в неопределенное состояние.
Строка 200:
}
}
===
<tt>Future</tt> ''(оставлено без перевода)'' является величиной, которая вычисляется параллельно некоторому потоку, чтобы быть использованной им немного позже. <tt>Future</tt> используется для облегчения параллельной обработки ресурсов. Типичное применение:
import scala.concurrent.ops._
Строка 216:
Обратите внимание, что последущие вызовы функции могут возвращать результат немедленно.
===Параллельные вычисления===
Следующий пример демонстрирует функцию par, которая принимает пару вычислений как параметры и возвращает результаты вычислений в другую пару. Оба вычисления выполняются параллельно.
Строка 243:
results
}
===
Классический механизм синхронизации процессов - семафор. Он предлагает два элементарных
действия: занятие и освобождение. Вот реализация простого семафора в Scala:
Строка 258:
}
}
===Читатели/Писатели===
Более сложная форма синхронизации различает ''читающие потоки'', которые имеют доступ к общему ресурсу, не модифицируя его, и потоки, которые могут и читать, и изменять ресурс - ''писатели ''. Для того, чтобы синхронизировать читателей и писателей, которые нам нужно осуществлять действия startRead, startWrite, endRead, endWrite, при том, что:
Строка 288:
}
}
===Асинхронные каналы===
Основной способ межпроцессной связи - асинхронный канал.
Здесь используется следующий простой класс для связанных списков:
Строка 326:
}
}
===Синхронные каналы===
Вот реализация синхронного канала, где передатчик сообщения блокируется, пока это сообщение не получено. Синхронному каналу необходима единственная переменная, чтобы хранить сообщения для транспорта, и две используются, чтобы координировать процессы чтения и записи.
Строка 353:
}
}
===Сервера вычислений===
Реализация сервера вычислений в <tt>Scala</tt>. Сервер выполняет <tt>future</tt> метод, который вычисляет данное выражение параллельно своему вызову. В отличие от реализации в Разделе 16.3, сервер вычисляет <tt>future</tt> только для предопределённого числа потоков. Предполагаемая реализация сервера могла бы запускать каждый поток на отдельном процессоре, что позволило бы избежать усложнений от переключения контекста потока, что характерно для однопроцессорных систем.
Строка 401:
Console.println(f())
}
===Почтовые ящики===
Почтовые ящики - это высокоуровневые и гибкие конструкции для синхронизации и взаимодействия процессов.
Строка 519:
===
В главе 3 представлен набросок электронного аукциона. Этот сервис основывался на высокоуровневых процессах - акторах, которые управляются сообщениями в почтовом ящике, используя сравнение по образцу. Актор является просто потоком, основа коммуникации которого - почтовый ящик. Акторы, следовательно, определяются как mixin композиция расширения класса Thread с классом MailBox.
|