SlideShare une entreprise Scribd logo
1  sur  22
7가지 동시성 모델
3장. 함수형 프로그래밍
아꿈사 스터디 - 정현수
함수형 언어의 장점
명령형 언어
명령형 언어는 “가변”이면서 “공유”되는 상태에만
동시성 프로그래밍을 적용할 수 있는 제약조건이 있다
가변 상태의 위험
❖숨겨진 가변 상태
➢ 현재 보이는 코드와 사용 중인 API의 문서를 보고서는 가변상태 여부를 파악하기 어렵다.
➢ 아래 코드는 그냥 보기엔 “가변 상태”를 갖지 않기 때문에 스레드 안정성이 보장되어 보인다.
가변 상태의 위험 (계속)
❖탈출한 가변 상태
➢ 아래 코드는 players 리스트는 private로 선언되었고,
synchronized를 통해 addPlayer()와 getPlayerIterator() 메서드에 접근하고 있다.
➢ 아래 코드는 겉으로는 “스레드-안정성”을 보장하는 것처럼 보인다.
getPlayerIterator() 의 리턴 값
players.iterator()가 사용되는 동안
addPlayer() 를 호출한다면 문제가 발생할 수 있다.
즉, 사용 중인 iterator의 원본 데이터에
변경이 발생하기 때문이다.
(ConcurrentModificationException)
가변 상태의 위험 (계속)
함수형 프로그래밍이
“동시성”, “병렬성”에 유리한 이유
함수형 프로그램은 가변 상태가 존재하지 않는다.
따라서 원천적으로 가변 상태의 위험에서 회피할 수 있다.
명령형 프로그램 vs. 함수형 프로그램
❖주어진 수를 서로 더한 값 계산
Java
Clojure
명령형 프로그램 vs. 함수형 프로그램 (계속)
❖주어진 수를 서로 더한 값 계산
syntax : (reduce func [init val] coll)
example :
(reduce + [1 2 3 4 5]) ;;=> 15
(reduce + 1 [2 3]) ;;=> 6
명령형 프로그램 vs. 함수형 프로그램 (계속)
❖주어진 수를 서로 더한 값 계산
명령형 코드에 비해 간결해 졌다.
주요 특징
Lazy Sequence
❖Lazy Sequence
➢ Lazy Evaluation
➢ 계산의 결과 값이 필요할 때까지 실제 계산을 늦추는 기법
실제 필요할 때 필요한 만큼만 생성하여 작업을 수행하여 성능 향상 가능
➢ (take n coll)
■ Collection에서 처음 n개의 아이템만을 리턴
➢ (iterate f x)
■ 주어진 함수(f)를 초기 값(x)에 적용 시키고,
다음 번 순차 방문 때는 함수를 그 결과에 적용하는 과정을 무한히 반복
■ Returns a lazy sequence of x, (f x), (f (f x))....
참조 투명성
❖참조 투명성
➢ 어떤 함수가 호출 <위치> 및 <시점>에 관계없이 같은 입력 값에 대해서는 항상 같은 값을 반환
➢ 함수형 프로그램은 모든 함수가 참조 투명성 속성을 가진다.
즉, 계산 순서를 바꿀 수 있기 때문에 함수 코드의 병렬화가 쉬워진다.
➢ (+ (+ 1 2) (+ 3 4)) 코드는 함수 호출 순서에 관계없이 같은 결과 값을 가진다
(+ (+ 1 2) (+ 3 4)) ==> (+ (+ 1 2) 7) ==> (+ 3 7) ==> 10
(+ (+ 1 2) (+ 3 4)) ==> (+ 3 (+ 3 4)) ==> (+ 3 7) ==> 10
데이터 흐름
❖데이터 흐름(Data Flow) 프로그래밍
➢ 언어의 런타임이 그래프 왼쪽에서 시작하여
오른쪽으로 데이터를 “밀어내는 방식”으로 진행
➢ 어떤 함수와 관련된 “데이터”가 준비되어야
해당 함수가 실행 가능
➢ 각 함수는 동시에 실행 가능
➢ Clojure는 Future와 Promise를 통해 ‘데이터 흐름
프로그래밍’을 가능하게 한다. Future 역참조
Clojure의 Future
❖Future
➢ 문법 : (future & body)
➢ 코드의 몸체를 받아 다른 스레드에서 실행, 실행 결과를 캐싱하였다가 역참조시 리턴한다.
➢ 결과값 계산이 끝나지 않았다면 역참조는 값이 준비될 때까지 블로킹 된다.
➢ https://clojuredocs.org/clojure.core/future
Clojure의 Promise
❖Promise
➢ Future와 공통점
■ 값이 비동기적으로 준비된다
■ 값이 리턴되기 전까지 블로킹 된다
■ 역참조가 가능하다 : deref or @
➢ Future와 차이점
■ 실행될 코드 없이도 Promise를 만들 수 있다
■ deliver를 통해 값이 설정된다
병렬 처리
병렬로 처리하기
❖reduce vs. fold
➢ fold
■ clojure.core.reducers 패키지에 있는 함수
■ 분할 - 정복 전략을 통해 Parallel 하게 수행 가능 (reduce 동작을 병렬로 수행)
■ syntax : (fold [n] [combinef] reducef coll)
➢ reduce 함수를 fold 함수로 변경 : sum 함수를 병렬로 수행하도록 수정
약 2.5배 성능 향상
clojure.core.reducers 라이브러리
❖clojure.core.reducers
➢ A library for reduction and parallel folding
➢ 어떻게 축소시켜야 하는지에 대해 설명하는 일종의 조리법
➢ 실제 결과를 리턴하는 대신, 어떤 결과를 만들 수 있는 표현을 담는 조리법을 리턴
■ reduce 또는 fold에 전달되기 전까지 실행되지 않는다.
■ 중간 단계의 열이 만들어질 필요가 없기 때문에 더 효율적
■ fold가 컬렉션 내부에서 일어나는 모든 동작의 체인을 병렬화하는 것을 허용
병렬로 처리하기
❖map vs. pmap
➢ map : (map f coll)
■ 함수(f)와 열(coll)이 주어지면
열(coll)에 담긴 각 요소에 함수(f)를 적용한 결과를 담은 새로운 열을 리턴
➢ pmap : (pmap f coll)
■ map과 동일하지만, 함수(f)가 병렬로 실행
❖partition-all
➢ 문법 : (partiton-all n) (partition-all n coll) (partiton-all n step coll)
➢ 하나의 열(coll)을 여러 개(n)의 열로 묶거나 분할한다.
병렬로 처리하기
병렬로 처리하기
pmap
partiton-all
병렬로 처리하기
map보다 병렬로 수행하는 pmap이 더 빠르지만 전체적인 병합 횟수가 많다.
partition-all로 일괄처리하면 더 효율적이다.

Contenu connexe

Tendances

Tendances (20)

Log aggregation: using Elasticsearch, Fluentd/Fluentbit and Kibana (EFK)
Log aggregation: using Elasticsearch, Fluentd/Fluentbit and Kibana (EFK)Log aggregation: using Elasticsearch, Fluentd/Fluentbit and Kibana (EFK)
Log aggregation: using Elasticsearch, Fluentd/Fluentbit and Kibana (EFK)
 
How to Avoid Common Mistakes When Using Reactor Netty
How to Avoid Common Mistakes When Using Reactor NettyHow to Avoid Common Mistakes When Using Reactor Netty
How to Avoid Common Mistakes When Using Reactor Netty
 
Room 2 - 1 - Phạm Quang Minh - A real DevOps culture in practice
Room 2 - 1 - Phạm Quang Minh - A real DevOps culture in practiceRoom 2 - 1 - Phạm Quang Minh - A real DevOps culture in practice
Room 2 - 1 - Phạm Quang Minh - A real DevOps culture in practice
 
Service-mesh options with Linkerd, Consul, Istio and AWS AppMesh
Service-mesh options with Linkerd, Consul, Istio and AWS AppMeshService-mesh options with Linkerd, Consul, Istio and AWS AppMesh
Service-mesh options with Linkerd, Consul, Istio and AWS AppMesh
 
Introduction to Rust language programming
Introduction to Rust language programmingIntroduction to Rust language programming
Introduction to Rust language programming
 
MicroServices with Containers, Kubernetes & ServiceMesh
MicroServices with Containers, Kubernetes & ServiceMeshMicroServices with Containers, Kubernetes & ServiceMesh
MicroServices with Containers, Kubernetes & ServiceMesh
 
Kubernetes
KubernetesKubernetes
Kubernetes
 
Continuous Delivery to Kubernetes with Jenkins and Helm
Continuous Delivery to Kubernetes with Jenkins and HelmContinuous Delivery to Kubernetes with Jenkins and Helm
Continuous Delivery to Kubernetes with Jenkins and Helm
 
The Hitchhiker's Guide to Faster Builds. Viktor Kirilov. CoreHard Spring 2019
The Hitchhiker's Guide to Faster Builds. Viktor Kirilov. CoreHard Spring 2019The Hitchhiker's Guide to Faster Builds. Viktor Kirilov. CoreHard Spring 2019
The Hitchhiker's Guide to Faster Builds. Viktor Kirilov. CoreHard Spring 2019
 
Docker and Go: why did we decide to write Docker in Go?
Docker and Go: why did we decide to write Docker in Go?Docker and Go: why did we decide to write Docker in Go?
Docker and Go: why did we decide to write Docker in Go?
 
Confluent Startup Webinar Series
 Confluent Startup Webinar Series Confluent Startup Webinar Series
Confluent Startup Webinar Series
 
In the DOM, no one will hear you scream
In the DOM, no one will hear you screamIn the DOM, no one will hear you scream
In the DOM, no one will hear you scream
 
Learn nginx in 90mins
Learn nginx in 90minsLearn nginx in 90mins
Learn nginx in 90mins
 
Securing and Automating Kubernetes with Kyverno
Securing and Automating Kubernetes with KyvernoSecuring and Automating Kubernetes with Kyverno
Securing and Automating Kubernetes with Kyverno
 
Kubernetes security
Kubernetes securityKubernetes security
Kubernetes security
 
Everything as Code with Terraform
Everything as Code with TerraformEverything as Code with Terraform
Everything as Code with Terraform
 
Kubernetes #4 volume &amp; stateful set
Kubernetes #4   volume &amp; stateful setKubernetes #4   volume &amp; stateful set
Kubernetes #4 volume &amp; stateful set
 
Rancher Rodeo 13 mai 2022
Rancher Rodeo 13 mai 2022Rancher Rodeo 13 mai 2022
Rancher Rodeo 13 mai 2022
 
Distributed Locking in Kubernetes
Distributed Locking in KubernetesDistributed Locking in Kubernetes
Distributed Locking in Kubernetes
 
How to Prepare for CKA Exam
How to Prepare for CKA ExamHow to Prepare for CKA Exam
How to Prepare for CKA Exam
 

En vedette

암호화 기법.Ver2
암호화 기법.Ver2암호화 기법.Ver2
암호화 기법.Ver2
Sein Jang
 
클로져 소개 강의 (한국정보통신산업노동조합)
클로져 소개 강의 (한국정보통신산업노동조합)클로져 소개 강의 (한국정보통신산업노동조합)
클로져 소개 강의 (한국정보통신산업노동조합)
Sang-Kyu Park
 
[추천] 색인기법 김성현
[추천] 색인기법 김성현[추천] 색인기법 김성현
[추천] 색인기법 김성현
Young-jun Jeong
 
Presentatie ISM - VCV Kring Innovatiemanagement 6 maart 2014
Presentatie  ISM - VCV Kring Innovatiemanagement   6 maart 2014Presentatie  ISM - VCV Kring Innovatiemanagement   6 maart 2014
Presentatie ISM - VCV Kring Innovatiemanagement 6 maart 2014
hkooistra
 
RIL FY 13-14 media release
RIL FY 13-14 media releaseRIL FY 13-14 media release
RIL FY 13-14 media release
Flame Of Truth
 
thecarlysaga
thecarlysaga thecarlysaga
thecarlysaga
brunizer
 
Presentatie ShiftAdvisor - VCV Kring Innovatiemanagement 6 maart 2014
Presentatie  ShiftAdvisor - VCV Kring Innovatiemanagement   6 maart 2014Presentatie  ShiftAdvisor - VCV Kring Innovatiemanagement   6 maart 2014
Presentatie ShiftAdvisor - VCV Kring Innovatiemanagement 6 maart 2014
hkooistra
 

En vedette (19)

7가지 동시성 모델 - 6장. 순차 프로세스 통신
7가지 동시성 모델 - 6장. 순차 프로세스 통신7가지 동시성 모델 - 6장. 순차 프로세스 통신
7가지 동시성 모델 - 6장. 순차 프로세스 통신
 
7가지 동시성 모델 - 데이터 병렬성
7가지 동시성 모델 - 데이터 병렬성7가지 동시성 모델 - 데이터 병렬성
7가지 동시성 모델 - 데이터 병렬성
 
암호화 기법.Ver2
암호화 기법.Ver2암호화 기법.Ver2
암호화 기법.Ver2
 
실무로 배우는 시스템 성능 최적화 10부. 네트워크 모니터링
실무로 배우는 시스템 성능 최적화   10부. 네트워크 모니터링실무로 배우는 시스템 성능 최적화   10부. 네트워크 모니터링
실무로 배우는 시스템 성능 최적화 10부. 네트워크 모니터링
 
Ddd start! 6장. 응용 서비스와 표현 영역
Ddd start!   6장. 응용 서비스와 표현 영역Ddd start!   6장. 응용 서비스와 표현 영역
Ddd start! 6장. 응용 서비스와 표현 영역
 
7가지 동시성 모델 4장
7가지 동시성 모델 4장7가지 동시성 모델 4장
7가지 동시성 모델 4장
 
함수적 사고 2장
함수적 사고 2장함수적 사고 2장
함수적 사고 2장
 
클로져 소개 강의 (한국정보통신산업노동조합)
클로져 소개 강의 (한국정보통신산업노동조합)클로져 소개 강의 (한국정보통신산업노동조합)
클로져 소개 강의 (한국정보통신산업노동조합)
 
Concurreny programming
Concurreny programmingConcurreny programming
Concurreny programming
 
[추천] 색인기법 김성현
[추천] 색인기법 김성현[추천] 색인기법 김성현
[추천] 색인기법 김성현
 
Why KG Gas Matters To You (ગુજરાતી)
Why KG Gas Matters To You (ગુજરાતી)Why KG Gas Matters To You (ગુજરાતી)
Why KG Gas Matters To You (ગુજરાતી)
 
USAJOBS
USAJOBSUSAJOBS
USAJOBS
 
Os 10 produtos mais vendidos na internet
Os 10 produtos mais vendidos na internetOs 10 produtos mais vendidos na internet
Os 10 produtos mais vendidos na internet
 
Presentatie ISM - VCV Kring Innovatiemanagement 6 maart 2014
Presentatie  ISM - VCV Kring Innovatiemanagement   6 maart 2014Presentatie  ISM - VCV Kring Innovatiemanagement   6 maart 2014
Presentatie ISM - VCV Kring Innovatiemanagement 6 maart 2014
 
RIL FY 13-14 media release
RIL FY 13-14 media releaseRIL FY 13-14 media release
RIL FY 13-14 media release
 
thecarlysaga
thecarlysaga thecarlysaga
thecarlysaga
 
Presentatie ShiftAdvisor - VCV Kring Innovatiemanagement 6 maart 2014
Presentatie  ShiftAdvisor - VCV Kring Innovatiemanagement   6 maart 2014Presentatie  ShiftAdvisor - VCV Kring Innovatiemanagement   6 maart 2014
Presentatie ShiftAdvisor - VCV Kring Innovatiemanagement 6 maart 2014
 
KG Gas: The Flame Of Truth (HINDI)
KG Gas: The Flame Of Truth (HINDI)KG Gas: The Flame Of Truth (HINDI)
KG Gas: The Flame Of Truth (HINDI)
 
скн 10
скн 10скн 10
скн 10
 

Similaire à 7가지 동시성 모델 - 3장. 함수형 프로그래밍

김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
min woog kim
 
카사 공개세미나1회 W.E.L.C.
카사 공개세미나1회  W.E.L.C.카사 공개세미나1회  W.E.L.C.
카사 공개세미나1회 W.E.L.C.
Ryan Park
 
자바스크립트 함수
자바스크립트 함수자바스크립트 함수
자바스크립트 함수
유진 변
 
이펙티브 C++ (7~9)
이펙티브 C++ (7~9)이펙티브 C++ (7~9)
이펙티브 C++ (7~9)
익성 조
 
Effective c++(chapter 5,6)
Effective c++(chapter 5,6)Effective c++(chapter 5,6)
Effective c++(chapter 5,6)
문익 장
 
동기화, 스케줄링
동기화, 스케줄링동기화, 스케줄링
동기화, 스케줄링
xxbdxx
 

Similaire à 7가지 동시성 모델 - 3장. 함수형 프로그래밍 (20)

Clojure Chapter.6
Clojure Chapter.6Clojure Chapter.6
Clojure Chapter.6
 
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
 
Clojure Monad
Clojure MonadClojure Monad
Clojure Monad
 
카사 공개세미나1회 W.E.L.C.
카사 공개세미나1회  W.E.L.C.카사 공개세미나1회  W.E.L.C.
카사 공개세미나1회 W.E.L.C.
 
자바스크립트 함수
자바스크립트 함수자바스크립트 함수
자바스크립트 함수
 
이펙티브 C++ (7~9)
이펙티브 C++ (7~9)이펙티브 C++ (7~9)
이펙티브 C++ (7~9)
 
MongoDB 하루만에 끝내기
MongoDB 하루만에 끝내기MongoDB 하루만에 끝내기
MongoDB 하루만에 끝내기
 
Effective c++(chapter 5,6)
Effective c++(chapter 5,6)Effective c++(chapter 5,6)
Effective c++(chapter 5,6)
 
Swift3 subscript inheritance initialization
Swift3 subscript inheritance initializationSwift3 subscript inheritance initialization
Swift3 subscript inheritance initialization
 
스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오
 
NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스
 
동기화, 스케줄링
동기화, 스케줄링동기화, 스케줄링
동기화, 스케줄링
 
About Visual C++ 10
About  Visual C++ 10About  Visual C++ 10
About Visual C++ 10
 
Java8 람다
Java8 람다Java8 람다
Java8 람다
 
JDK 변천사
JDK 변천사JDK 변천사
JDK 변천사
 
5 swift 기초함수
5 swift 기초함수5 swift 기초함수
5 swift 기초함수
 
06장 함수
06장 함수06장 함수
06장 함수
 
C++에서 Objective-C까지
C++에서 Objective-C까지C++에서 Objective-C까지
C++에서 Objective-C까지
 
Startup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSStartup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JS
 
Concurrent Programming (Java thread 다루기)
Concurrent Programming (Java thread 다루기)Concurrent Programming (Java thread 다루기)
Concurrent Programming (Java thread 다루기)
 

7가지 동시성 모델 - 3장. 함수형 프로그래밍

  • 1. 7가지 동시성 모델 3장. 함수형 프로그래밍 아꿈사 스터디 - 정현수
  • 3. 명령형 언어 명령형 언어는 “가변”이면서 “공유”되는 상태에만 동시성 프로그래밍을 적용할 수 있는 제약조건이 있다
  • 4. 가변 상태의 위험 ❖숨겨진 가변 상태 ➢ 현재 보이는 코드와 사용 중인 API의 문서를 보고서는 가변상태 여부를 파악하기 어렵다. ➢ 아래 코드는 그냥 보기엔 “가변 상태”를 갖지 않기 때문에 스레드 안정성이 보장되어 보인다.
  • 5. 가변 상태의 위험 (계속) ❖탈출한 가변 상태 ➢ 아래 코드는 players 리스트는 private로 선언되었고, synchronized를 통해 addPlayer()와 getPlayerIterator() 메서드에 접근하고 있다. ➢ 아래 코드는 겉으로는 “스레드-안정성”을 보장하는 것처럼 보인다. getPlayerIterator() 의 리턴 값 players.iterator()가 사용되는 동안 addPlayer() 를 호출한다면 문제가 발생할 수 있다. 즉, 사용 중인 iterator의 원본 데이터에 변경이 발생하기 때문이다. (ConcurrentModificationException)
  • 6. 가변 상태의 위험 (계속) 함수형 프로그래밍이 “동시성”, “병렬성”에 유리한 이유 함수형 프로그램은 가변 상태가 존재하지 않는다. 따라서 원천적으로 가변 상태의 위험에서 회피할 수 있다.
  • 7. 명령형 프로그램 vs. 함수형 프로그램 ❖주어진 수를 서로 더한 값 계산 Java Clojure
  • 8. 명령형 프로그램 vs. 함수형 프로그램 (계속) ❖주어진 수를 서로 더한 값 계산 syntax : (reduce func [init val] coll) example : (reduce + [1 2 3 4 5]) ;;=> 15 (reduce + 1 [2 3]) ;;=> 6
  • 9. 명령형 프로그램 vs. 함수형 프로그램 (계속) ❖주어진 수를 서로 더한 값 계산 명령형 코드에 비해 간결해 졌다.
  • 11. Lazy Sequence ❖Lazy Sequence ➢ Lazy Evaluation ➢ 계산의 결과 값이 필요할 때까지 실제 계산을 늦추는 기법 실제 필요할 때 필요한 만큼만 생성하여 작업을 수행하여 성능 향상 가능 ➢ (take n coll) ■ Collection에서 처음 n개의 아이템만을 리턴 ➢ (iterate f x) ■ 주어진 함수(f)를 초기 값(x)에 적용 시키고, 다음 번 순차 방문 때는 함수를 그 결과에 적용하는 과정을 무한히 반복 ■ Returns a lazy sequence of x, (f x), (f (f x))....
  • 12. 참조 투명성 ❖참조 투명성 ➢ 어떤 함수가 호출 <위치> 및 <시점>에 관계없이 같은 입력 값에 대해서는 항상 같은 값을 반환 ➢ 함수형 프로그램은 모든 함수가 참조 투명성 속성을 가진다. 즉, 계산 순서를 바꿀 수 있기 때문에 함수 코드의 병렬화가 쉬워진다. ➢ (+ (+ 1 2) (+ 3 4)) 코드는 함수 호출 순서에 관계없이 같은 결과 값을 가진다 (+ (+ 1 2) (+ 3 4)) ==> (+ (+ 1 2) 7) ==> (+ 3 7) ==> 10 (+ (+ 1 2) (+ 3 4)) ==> (+ 3 (+ 3 4)) ==> (+ 3 7) ==> 10
  • 13. 데이터 흐름 ❖데이터 흐름(Data Flow) 프로그래밍 ➢ 언어의 런타임이 그래프 왼쪽에서 시작하여 오른쪽으로 데이터를 “밀어내는 방식”으로 진행 ➢ 어떤 함수와 관련된 “데이터”가 준비되어야 해당 함수가 실행 가능 ➢ 각 함수는 동시에 실행 가능 ➢ Clojure는 Future와 Promise를 통해 ‘데이터 흐름 프로그래밍’을 가능하게 한다. Future 역참조
  • 14. Clojure의 Future ❖Future ➢ 문법 : (future & body) ➢ 코드의 몸체를 받아 다른 스레드에서 실행, 실행 결과를 캐싱하였다가 역참조시 리턴한다. ➢ 결과값 계산이 끝나지 않았다면 역참조는 값이 준비될 때까지 블로킹 된다. ➢ https://clojuredocs.org/clojure.core/future
  • 15. Clojure의 Promise ❖Promise ➢ Future와 공통점 ■ 값이 비동기적으로 준비된다 ■ 값이 리턴되기 전까지 블로킹 된다 ■ 역참조가 가능하다 : deref or @ ➢ Future와 차이점 ■ 실행될 코드 없이도 Promise를 만들 수 있다 ■ deliver를 통해 값이 설정된다
  • 17. 병렬로 처리하기 ❖reduce vs. fold ➢ fold ■ clojure.core.reducers 패키지에 있는 함수 ■ 분할 - 정복 전략을 통해 Parallel 하게 수행 가능 (reduce 동작을 병렬로 수행) ■ syntax : (fold [n] [combinef] reducef coll) ➢ reduce 함수를 fold 함수로 변경 : sum 함수를 병렬로 수행하도록 수정 약 2.5배 성능 향상
  • 18. clojure.core.reducers 라이브러리 ❖clojure.core.reducers ➢ A library for reduction and parallel folding ➢ 어떻게 축소시켜야 하는지에 대해 설명하는 일종의 조리법 ➢ 실제 결과를 리턴하는 대신, 어떤 결과를 만들 수 있는 표현을 담는 조리법을 리턴 ■ reduce 또는 fold에 전달되기 전까지 실행되지 않는다. ■ 중간 단계의 열이 만들어질 필요가 없기 때문에 더 효율적 ■ fold가 컬렉션 내부에서 일어나는 모든 동작의 체인을 병렬화하는 것을 허용
  • 19. 병렬로 처리하기 ❖map vs. pmap ➢ map : (map f coll) ■ 함수(f)와 열(coll)이 주어지면 열(coll)에 담긴 각 요소에 함수(f)를 적용한 결과를 담은 새로운 열을 리턴 ➢ pmap : (pmap f coll) ■ map과 동일하지만, 함수(f)가 병렬로 실행 ❖partition-all ➢ 문법 : (partiton-all n) (partition-all n coll) (partiton-all n step coll) ➢ 하나의 열(coll)을 여러 개(n)의 열로 묶거나 분할한다.
  • 22. 병렬로 처리하기 map보다 병렬로 수행하는 pmap이 더 빠르지만 전체적인 병합 횟수가 많다. partition-all로 일괄처리하면 더 효율적이다.