김동형수 개발기

Grokking Functional Programming - 2부 10장 본문

책 스터디/[완료] FP - Grokking Funtional Programming

Grokking Functional Programming - 2부 10장

김동형수 2023. 1. 26. 20:54

10 동시 프로그램

이 장에서 배울 것입니다

  • 선언적으로 동시 프로그램 흐름을 설계하는 방법
  • 경량 가상 스레드(파이버)를 사용하는 방법
  • 서로 다른 스레드의 데이터를 안전하게 저장하고 액세스하는 방법
  • 이벤트 스트림을 비동기적으로 처리하는 방법

불변 값과 순수 함수만 다룰 수 있을 때 동시성 프로그램을 작성하는 것이 훨씬 쉽습니다.
지금까지 배운 모든 내용은 멀티스레드 환경에도 적용할 수 있습니다

진행순서

1 단계
순차적 IO
2 단계
파이버가 있는 IO
3단계
동시 IO 및 비동기 액세스

순처적으로 일괄 처리되는 프로세스를 '일괄처리'라 명한다.

배치의 필요성
책에서는 수십만의 stream을 처리할 때 오래걸리니 배치가 필요하다고 한다.
스트림 조합기 : chunkN - stream을 chunkN의 매개변수 만큼 그룹핑해서 묶어주는 것으로 이해

이것은 차례로 우리를 공유 가변 상태 문제에 노출시킵니다.순위 기능 checkIns Map은 체크인 처리 기능에 의해 업데이트되는 현재 에 액세스해야 하기 때문입니다. 따라서 모든 실행 스레드는 시간이 지남에 따라 추가로 변경되는 동일한 메모리 주소에 액세스해야 합니다. 이것은 동시 공유 가변 상태입니다 .우리는 함수형 프로그래밍 기술을 사용하여 이를 다루려고 노력할 것입니다.

보다 일반적으로 동기화 프리미티브

 
  • 공통 리소스에 대한 액세스 동기화 —예: 파일, 소켓, 메모리 내 변수, 데이터베이스 연결 임계 섹션 문제라고도 함
  • 여러 스레드의 실행 순서 동기화(또는 조정) - 예를 들어 다른 스레드가 무언가를 생성한 후에만 스레드가 실행을 시작하는지 확인하거나 스레드 집합을 시작하기 전에 무언가가 발생하기를 기다리는 것 스레드 신호/스레드 상호 작용 문제라고도 함

Actor Model
액터 는 상태를 캡슐화 하며 액터 및 해당 상태와 상호 작용할 수 있는 유일한 방법은 비동기 메시지를 보내고 받는 것 입니다.

Atomic reference
원자 참조비교 및 설정 을 사용하는 매우 실용적인 메커니즘입니다. 저자는 더 나은 옵션을 소개하고 싶어한다.
FP에서 프로그래머는 동시성 프로그램을 만들 때 원자 참조를 많이 사용하는 경향이 있습니다.

Ref
동시에 액세스할 수 있는 공유 가변 상태를 불변 값으로 모델링합니다.
Ref.of 를 이용하면 IO[Ref], 즉 IO로 둘러쌓인 Ref를 반환함
모든 업데이트 작업은 안전하게 실행되도록 보장됩니다(즉, 다른 스레드에서 오는 업데이트를 덮어쓰지 않음).

모든 작업을 동시에 수행

Thread개체 를 만들 필요가 없습니다 . 병렬로 실행해야 하는 항목을 선언적으로 지정하기만 하면 됩니다

sequence 순차적으로 실행

 

FP에서 다중 스레드 프로그램은 순차 프로그램의 불변 목록으로 모델링할 수 있습니다.

parSequence는 sequence와 다르게 병렬실행이된다.

 

Scala를 포함한 많은 최신 프로그래밍 언어 및 라이브러리는 스레드에 대해 더 가벼운 개념인 파이버 (또는 녹색 스레드 )를 사용합니다.). 이는 OS 수준의 스레딩과 직접 연결되지 않는 효율적인 동시성 메커니즘이므로 훨씬 더 유용하고 가볍고 걱정이 없습니다. 개념적으로 그것들은 정확히 같은 용도로 사용됩니다. 병렬로 실행하는 것입니다.

파이버는 여전히 스레드 풀을 사용하지만 애플리케이션 관점에서 완전히 분리됩니다 .

Nothing을 이용한 무한재귀
foreverM

IO[A].start => FiberIO[A]
fiber는 cancel 함수가 있다.

Comments