Скала и Эрланг используют зеленые нити? - PullRequest
14 голосов
/ 02 апреля 2010

Я много читал о том, как Scala и Erlang делают легкие потоки и их модель параллелизма (актеры).

Однако у меня есть сомнения.

Используют ли Scala и Erlang подход, аналогичный старой модели потоков, используемой в Java (зеленые потоки)?

Например, предположим, что есть машина с 2 ядрами, поэтому среда Scala / Erlang будет разветвлять один поток на процессор? Другие потоки будут запланированы средой пользовательского пространства (Scala VM / Erlang VM). Это правильно?

Как это работает под капотом?

Ответы [ 4 ]

24 голосов
/ 02 апреля 2010

Эрланг использует многозадачность в пользовательском пространстве, задачи выполняются до тех пор, пока они не заблокируются или пока не израсходуют свою долю «сокращений». Сокращение смутно определяется как единица вычисления.

Вплоть до планировщика SMP, был только один поток ядра, выполняющий выполняемые задачи. При планировании SMP у вас есть несколько потоков ядра, выполняющих задачи и, таким образом, выполняющих код параллельно на многоядерных машинах. Количество потоков планировщика должно соответствовать количеству ядер. См. Переключатель -smp [enable|auto|disable] в справочную страницу erl .

Был также пул потоков ядра для загружаемых драйверов для выполнения блокирующих системных вызовов. Это называется пулом асинхронных потоков. См. +A size в справочную страницу erl .

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

13 голосов
/ 02 апреля 2010

Scala 2.8 использует пулы потоков Java. Легкие актеры (Reactor) и более тяжелые актеры в облегченном режиме (react {...}) не берут свою нить; скорее, когда у них есть сообщение, они берут поток до тех пор, пока не завершат его обработку, затем возвращают поток и вообще не запускаются до следующего сообщения.

Эта статья дает достойное описание актеров в 2.7; 2.8 ничем не отличается.

4 голосов
/ 02 апреля 2010

Для получения последней информации о деталях реализации Erlang проверьте fresh talk ( слайды ).

2 голосов
/ 02 апреля 2010

Scala использует базовую реализацию потоков Java, которая использует собственные потоки .

Не могу сказать об Эрланге.

...