먼저 Java 경험이 많지만 최근에야 함수형 언어에 관심이 생겼다고 말씀 드리겠습니다. 최근에 저는 아주 좋은 언어처럼 보이는 Scala를보기 시작했습니다.
그러나 저는 Programming in Scala 에서 Scala의 Actor 프레임 워크에 대해 읽고 있는데, 제가 이해하지 못하는 한 가지가 있습니다. 30.4 장에서는 react
대신 receive
사용하면 스레드를 재사용 할 수 있으며 이는 JVM에서 스레드가 비싸기 때문에 성능에 좋습니다.
react
대신 을 호출 하는 것을 기억하는 한 receive
원하는만큼 액터를 시작할 수 있다는 뜻 입니까? Scala를 발견하기 전에 저는 Erlang을 가지고 놀았으며 Programming Erlang 의 저자 는 땀을 흘리지 않고 200,000 개 이상의 프로세스를 생성하는 것을 자랑합니다. 나는 Java 스레드로 그렇게하는 것을 싫어합니다. Erlang (및 Java)과 비교하여 Scala에서 어떤 종류의 제한을보고 있습니까?
또한이 스레드 재사용은 Scala에서 어떻게 작동합니까? 간단하게 스레드가 하나만 있다고 가정 해 보겠습니다. 내가 시작한 모든 액터가이 스레드에서 순차적으로 실행됩니까, 아니면 일종의 작업 전환이 발생합니까? 예를 들어 서로에게 메시지를 핑퐁하는 두 액터를 시작하면 동일한 스레드에서 시작되면 교착 상태가 발생할 위험이 있습니까?
Programming in Scala 에 따르면 사용할 액터를 작성하는 react
것은 receive
. react
반환되지 않기 때문에 이것은 그럴듯하게 들립니다 . 그러나이 책은 계속해서를 react
사용하여 루프 안에 넣는 방법을 보여줍니다 Actor.loop
. 결과적으로
loop {
react {
...
}
}
나에게 꽤 비슷해 보인다
while (true) {
receive {
...
}
}
이 책의 앞부분에서 사용되었습니다. 그럼에도 불구하고이 책은 "실제로 프로그램은 최소한 몇 개의 receive
' 가 필요하다 '고 말합니다. 그래서 내가 여기서 무엇을 놓치고 있습니까? 무엇을 할 수 receive
그렇게 react
반환 외에, 수 없습니다를? 그리고 내가 왜 신경 쓰나요?
마지막으로, 내가 이해하지 못하는 것의 핵심에 도달했습니다.이 책에서는 using react
이 스레드를 재사용하기 위해 호출 스택을 버릴 수 있는 방법을 계속 언급 하고 있습니다. 어떻게 작동합니까? 호출 스택을 버려야하는 이유는 무엇입니까? 그리고 함수가 예외 ( react
) 를 던져 종료 할 때 호출 스택을 버릴 수있는 이유는 receive
무엇입니까?
저는 Programming in Scala 가 여기에서 몇 가지 주요 문제를 다루고 있다는 인상을 받았습니다. 그렇지 않으면 정말 훌륭한 책이기 때문입니다.