scala - 구조 - 스칼라는 어떻게 병렬 처리를 달성합니까?




scala akka library (2)

분산 시스템에 관한 강의를 듣고 있으며 Scala를 사용하여 프로젝트를 만들어야합니다. 강사는 스칼라가 여러 코어를 사용하여 계산을 수행하고 배우 모델과 통합되는 동안 문제를 해결하기 위해 병렬 처리를 사용한다는 점에서 훌륭하다고 말했습니다.

이것은 이론적 인 질문입니다. Akka를 사용하여 액터 모델에 대한 몇 가지 기본 사항을 배웠습니다. 프로그래밍하는 동안 사용자가 다양한 액터가 여러 코어에서 작업 할 수 있도록 컴파일러에 세부 사항을 제공해야하거나 스칼라가이를 처리하고 여러 항목을 사용합니다. 다양한 배우를위한 코어?

간단히 말해서 나의 질문은 : 스칼라에서 Akka 라이브러리를 사용하여 여러 액터를 선언 할 때 스칼라 컴파일러가 멀티 코어 CPU를 자동으로 사용하여 코어 사이에 다양한 액터를 배포하거나 프로그래머가이를 위해 몇 가지 입력을 제공해야합니까?


theon의 대답은 꽤 좋지만, 배우가 Scala에서 병렬 처리를 수행하는 유일한 방법은 아니라는 점을 지적하고자합니다. 상태를 관리 할 필요가 없다면 Futures는 일반적으로 병렬로 계산을 수행하는 더 간단한 방법입니다. Future 팩토리 함수에 대한 호출에서 다른 코드와 독립적으로 실행할 수있는 코드 스 니펫을 래핑하면 map , flatMap , fold 등의 호출을 사용하여 각 스 니펫의 결과를 구성 / 변형 할 수 있습니다. , 또는 이해를 for . 구성 할 필요가있는 것은 ExecutionContext 이며, Akka를 이미 사용하고 있다면 액터가 사용하는 것과 동일한 것을 사용하거나 미리 구성된 전역 기본값을 사용할 수 있습니다.


TL : DR : Akka의 기본 구성을 사용하면 대부분의 유스 케이스에 대해 거의 병렬 처리를 수행 할 필요가 없습니다.

길게 대답 : Akka의 액터는 Dispatcher에서 실행되며 Dispatcher에는 일반적으로 Threads 풀인 ExecutionService가 있습니다. 스레드 수는 개발자가 구성하지만 기본적으로 시스템의 CPU 코어 수의 3 배입니다 (참조 구성의 default-dispatcher.parallelism-factor 참조).

언제든지 각 CPU 코어는 이러한 스레드 중 하나를 사용하여 액터를 실행할 수 있으므로 CPU의 코어 수와 동일한 수의 스레드가 Dispatcher의 ExecutionService에 있으면 사용자는 이점을 활용할 수 있습니다 모든 코어의. 이것이 기본 구성의 코어 수의 3 배로 설정되는 이유는 IO 차단에 대한 보상입니다.

입출력 속도가 느리며, CPU를 사용하는 대신 입출력을 할 때 호그 스레드를 호출하는 것을 차단합니다. 따라서 최상의 병렬 처리 수준을 얻으려면 스레드 풀을 구성해야합니다.

  • 논 블로킹 IO 만 수행하는 경우 CPU 코어 수로 설정하고 CPU를 최대한 활용하고 있다고 확신 할 수 있습니다.
  • IO를 더 많이 차단할수록 병렬 처리가 계속 유지되어야하지만 더 많은 스레드가 필요합니다. 사용하는 스레드가 많을수록 메모리 사용량이 많아지고 쓰레드는 세계에서 가장 경량이 아닙니다.




actor-model