Do Scala и Erlang используют зеленые потоки?
Я много читал о том, как Scala и Erlang делает легкие потоки и их модель concurrency (актеры).
Однако у меня есть свои сомнения.
Do Scala и Erlang используют подход, похожий на модель старого потока, используемую Java (зеленые потоки)?
Например, предположим, что есть машина с 2 ядрами, поэтому среда Scala/Erlang будет разветвлять один поток на процессор? Другие потоки будут запланированы с помощью пользовательского пространства (Scala VM/Erlang VM). Правильно ли это?
Под капотом, как это работает?
Ответы
Ответ 1
Erlang использует многозадачность для пользовательского пространства, задачи запускаются до тех пор, пока они не блокируют или пока не исчерпают свою долю "сокращений". Сокращение неопределенно определяется как единица вычисления.
До планировщика SMP существовал только один поток ядра, выполняющий выполняемые задачи. При планировании SMP у вас есть несколько потоков ядра, выполняющих задачи, и, таким образом, параллельный запуск кода на многоядерных машинах. Количество потоков планировщика должно соответствовать количеству ядер. См. Переключатель -smp [enable|auto|disable]
в справочной странице erl.
Также существует пул потоков ядра для загружаемых драйверов для выполнения системных вызовов блокировки. Это называется пулом потоков async. См. +A size
в справочной странице erl.
Дальнейшее чтение
Ответ 2
Scala 2.8 использует пулы потоков Java. Легкие актеры (Reactor
) и более тяжелые актеры в облегченном режиме (react {...}
) не берут свою нить; скорее, когда у них есть сообщение, они берут поток, пока они не обработают сообщение, а затем возвращают поток и не запускаются вообще до следующего сообщения.
Эта статья дает достойное описание Актеров в 2.7; 2.8 не отличается.
Ответ 3
Для получения последних сведений о деталях реализации Erlang проверьте свежий разговор (слайды).
Ответ 4
Scala использует базовую реализацию потока Java, которая использует собственные потоки.
Не могу сказать об Эрланге.