Подтвердить что ты не робот

Почему Scala подходит для concurrency?

Существуют ли какие-либо специальные операторы concurrency, или функциональное программирование стиля полезно для concurrency? И почему?

4b9b3361

Ответ 1

В настоящий момент Scala уже поддерживает две основные стратегии для concurrency - на основе потоков concurrency (полученные от Java) и с типом безопасности concurrency (вдохновленный Эрланг). В ближайшем будущем (Scala 2.9) будут добавлены два больших дополнения:

Синтаксис актера (операторы concurrency) в значительной степени зависит от Erlang (с некоторыми важными дополнениями) - в отношении используемой библиотеки (стандартные актеры, Akka, Lift, scalaz) будут разные комбинации вопросов и восклицаний Знаки: ! (в большинстве случаев для отправки сообщения в одну сторону), !!, !? и т.д.

Кроме того, первоклассные функции упрощают жизнь, даже когда вы работаете со старыми фреймами Java concurrency: ExecutorService, Fork-Join Framework и т.д.

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

Ответ 2

Существует ряд особенностей языка, которые делают Scala полезным для concurrency. Например:

  • Большинство структур данных являются неизменяемыми и не требуют ничего особенного для одновременного доступа.
  • Функциональный стиль - действительно хороший способ выполнять высококонкурентные операции.
  • Scala включает в себя действительно удобную "актерскую" структуру, которая помогает при одновременных асинхронных операциях.

Дальнейшее чтение:

http://www.ibm.com/developerworks/java/library/j-scala02049.html

http://blog.objectmentor.com/articles/2008/08/14/the-seductions-of-scala-part-iii-concurrent-programming

http://akka.io

Ответ 3

Ну, есть реклама, и есть реальность. Scala получил известность за то, что он хорош для concurrency, потому что это функциональный язык и из-за его библиотеки участников. Функциональные языки хороши для concurrency, потому что они сосредоточены на неизменности, что помогает одновременным алгоритмам. Актеры получили свою репутацию, потому что они являются базой для послужной список Эрланг из массивных параллельных систем.

Итак, в некотором смысле, репутация Scala должна быть "мной тоже" успешных методов. Тем не менее, есть что-то, что Scala выводит на стол, что является его способностью поддерживать такие дополнения к языку через библиотеки, что позволяет ему адаптировать и применять новые методы по мере их разработки.

Актеры не являются родными по отношению к Scala, и все же в этой области уже есть разные библиотеки, которые кажутся. Также нет транзакционной памяти, но, опять же, есть уже библиотеки, которые выглядят так, как будто они.

Они, эти библиотеки, даже доступны для java, но там они неуклюжи в использовании.

Таким образом, секрет заключается не столько в том, что он может сделать, а в том, что он делает его легким.

Ответ 4

Большое ключевое слово здесь - неизменность. См. эту страницу Wiki. Поскольку любая переменная может быть определена как изменяемая или неизменяемая, это большая победа для concurrency, поскольку, если объект не может быть изменен, он является потокобезопасным и, следовательно, проще писать параллельные программы.

Ответ 5

Просто, чтобы на каждом параде немного, см. этот вопрос.

Я дважды закодировал несколько многопоточных вещей в Scala (в основном используя Futures, немного с актерами) и С++ (с использованием TBB) с тех пор (в основном проблемы Project Euler). Общее изображение похоже, что Scala требует ~ 1/3 количества строк кода решения С++ (и быстрее записывается), но С++-решение будет ~ x10 быстрее исполняться (если вы не придете к некоторым усилиям избегайте "оттока объекта", как показано в быстрой версии в ответе, упомянутом выше, но в этот момент вы теряете большую часть элегантности Scala). Я все еще на 2.7.7. еще не пробовал Scala 2.8.

Использование Scala стало моей первой реальной встречей с языком, который сильно подчеркивал неизменность, и я впечатлен его силой, чтобы чрезвычайно упростить ментальную модель, которую вы должны поддерживать в объектных "государственных машинах" во время программирования (а это в свою очередь упрощает кодирование concurrency). Это, безусловно, повлияло на то, как я подхожу к кодированию на С++.