SlideShare una empresa de Scribd logo
1 de 41
Clojure
6장. Concurrency
아키텍트를 꿈꾸는 사람들 cafe.naver.com/architect1
현수명 soomong.net
#soomong
목차
병행성
공유된 자원
변수 만들기 실습
다른언어로 변수만들기
병행성 제어 Lib 4인방
ref , atom , agent , var
Example – Snake
Example – Lancet
Erlang 의 병행성
병행성?
여러가지를 동시에 일어나게 만드는 일
병행성!
어렵지 않음.
여러색의Thread 나 Process 를 띄우면 되요
문제는,
동시에 일어나는 일들
즉 도화지의
변화하는 상태를
어떻게 제어할 것인가
공유된 자원
공유된 자원?
Clojure 에서 변수를 어떻게 만들지?
변수!
변수 만들기 실습
(def X 5)
#’user/X
X
5
(def X 3)
#’user/X
(def ^{:user/comment "A"} x 5 )
(meta #’user/x)
{:ns #<Namespace user>,
:name x,
:file "NO_SOURCE_PATH",
:line 30,
:user/comment "A"}
(def x 3)
(meta #’user/x)
{:ns #<Namespace user>,
:name x,
:file "NO_SOURCE_PATH",
:line 32}
다른언어로 변수만들기
int x = 5;
x = 3;
Clojure 에서는?
데이터의 상태가 기본적으로 변경불가능
Clojure 에는 직접 변경할수있는 변수 없음
But. 예외가 있음
코드에서 명백하게 선언해야한다는
조건하에 간접적으로 변경 가능한
병행성 API 들을 제공
보통의 다른 언어들
모든 상태는 변경가능
상태변화가 코드전체에 뒤섞여 있음
병행성은Thread 로 구현
여러Thread 가 접근하는 경우
적절한 락을 통해
한번에 하나만 접근하도록 보호
int x = 5;
x = 3;
목차
병행성
공유된 자원
변수 만들기 실습
다른언어로 변수만들기
병행성 제어 Lib 4인방
ref , atom , agent , var
Example – Snake
Example – Lancet
Erlang 의 병행성
병행성 제어 Lib 4인방
ref + STM 제어 O 동기적 갱신
atom 제어 X 동기적 갱신
agent 제어 X 비동기적 갱신
var Thread 내부의 동적범위
ref
(def amount 3)
(ref amount)
(deref amount)
java.lang.ClassCastException: java.lang.Integer
cannot be cast to clojure.lang.IDeref (repl-1:33)
(def ref_amount (ref amount))
#'user/ref_amount
(deref ref_amount)
3
(alter ref_amount dec)
java.lang.IllegalStateException: No transaction
running (repl-1:40)
; 갱신할때 적절한 보호를 해주어야한다.
; Clojure 는 트랜잭션을 사용해서 보호
(dosync (alter ref_amount dec))
2
Clojure 의 병행성 제어 Lib 1
API ref
deref
ref-set
dosync
alter
commute
:validator
Clojure 의 병행성 제어 Lib 1
API ref
deref
ref-set
dosync
alter
commute
:validator
(def ref_amount (ref amount))
#'user/ref_amount
(deref ref_amount)
3
(ref-set ref_amount (def size 5)
java.lang.IllegalStateException: No transaction
running
; 갱신할때 적절한 보호를 해주어야한다.
; Clojure 는 트랜잭션을 사용해서 보호
(dosync (ref-set ref_amount (def size 5))
#'user/size
ref
Clojure 의 잠금
다른 언어에서는 데이터 보호를 위해
Lock 을 사용
Clojure 에서는 데이터 보호를 위해
Transaction 을 사용
STM Software Transaction Memory
Atomicity 원자성
Consistency 일관성
Isolation 고립성
Durability 영구성
Database 는 ACID
Clojure 는 ACI
ref
Clojure 의 병행성 제어 Lib 1
API ref
deref
ref-set
dosync
alter
commute
:validator
(def amount 3)
(def ref_amount (ref amount))
#'user/ref_amount
(def size 10)
(def ref_size (ref size))
#'user/ref_size
(dosync
(ref-set ref_amount 6)
(ref-set ref_size 20))
20
; 갱신이 하나의 트랜잭션 안에서 수행됨
ref
Clojure 의 병행성 제어 Lib 1
API ref
deref
ref-set
dosync
alter
commute
:validator
(defstruct message :sender :text)
(struct message "stu" "testmsg")
{:sender "stu", :text "testmsg"}
(def messages (ref ()))
#'user/messages
(defn native-add-msg [msg]
(dosync (ref-set messages (cons msg @messages))))
(defn add-msg [msg]
(dosync (alter messages conj msg)))
(add-msg (struct message "user1" "hello"))
({:sender "user1", :text "hello"})
(add-msg (struct message "user2" "hoho"))
({:sender "user2", :text "hoho"}
{:sender "user1", :text "hello"})
ref
Clojure 의 병행성 제어 Lib 1
API ref
deref
ref-set
dosync
alter
commute
:validator
(defn add-msg-commute [msg]
(dosync (commute messages conj msg)))
; 트랜잭션의 순서가 마음대로 재배열됨
(def validate-msg-list
(partial every? #(and (:sender %) (:text %))))
(def messages (ref () :validator validate-msg-list))
; 유효성 확인 추가
(add-message "not a valid msg")
java.lang.IllegalStateException: Invalid
reference state
(add-message (struct message "stu" "good message"))
({:sender "stu", :text "good message"})
병행성 제어 Lib 4인방
ref + STM 제어 O 동기적 갱신
atom 제어 X 동기적 갱신
agent 제어 X 비동기적 갱신
var Thread 내부의 동적범위
atom
Clojure 의 병행성 제어 Lib 2
API atom
reset!
swap!(def amount 3)
(def atom_amount (atom amount))
#'user/atom_amount
(deref atom_amount)
3
(reset! atom_amount 0)
0
; atom 은 트랜잭션 내에서 변경되는것이 아니기 때문에
; dosync 를 사용할 필요 없음 ( 제어 X )
; 동시에 2개의 atom 을 변경시키는것은 불가능!
; 이것이 ref 와의 차이점
(def atom_track (atom {:title "Hoot" :singer "SOSI"}))
#'user/atom_track
(swap! atom_track assoc :title "Huk")
병행성 제어 Lib 4인방
ref + STM 제어 O 동기적 갱신
atom 제어 X 동기적 갱신
agent 제어 X 비동기적 갱신
var Thread 내부의 동적범위
agent
Clojure 의 병행성 제어 Lib 3
API agent
send
await
:validator
clear-agent
(def counter (agent 0))
#'user/counter
(send counter inc)
#<Agent@482d59a3: 1>
; 비동기적으로 갱신되므로 inc 를 나중에 처리한다
(deref counter)
1
; 이값을 확인할때쯤이면 inc 는 이미 thread 풀에서 작업을 완료
; dosync 를 사용할 필요 없음 ( 제어 X )
(await counter)
; agent 에 대한 작업완료시까지 현재 수행되는 thread 를 block
agent
Clojure 의 병행성 제어 Lib 3
API agent
send
await
:validator
clear-agent-errors
(def counter (agent 0 :validator number?))
#'user/counter
(send counter (fn [_] "boo"))
#<Agent@5dde45e2 FAILED: 0>
; 유효성 검사에서 실패
(agent-errors counter)
(#<IllegalStateException
java.lang.IllegalStateException: Invalid reference
state>)
(clear-agent-errors counter)
0
병행성 제어 Lib 4인방
ref + STM 제어 O 동기적 갱신
atom 제어 X 동기적 갱신
agent 제어 X 비동기적 갱신
var Thread 내부의 동적범위
var
Clojure 의 병행성 제어 Lib 4
API binding
set!
(def foo 10)
#'user/foo
foo
10
(.start (Thread. (fn [] (println foo))))
nil
10
(binding [foo 42] foo)
42
(defn print-foo [] (println foo))
(let [foo “let foo”] (print-foo))
10
(binding [foo “bound foo”] (print-foo))
bound foo
var
Clojure 의 병행성 제어 Lib 4
API binding
set!(defn slow-double [n]
(Thread/sleep 100)
(* n 2))
(defn calls-slow-double []
(map slow-double [1 2 1 2 1 2]))
(time (dorun (calls-slow-double)))
"Elapsed time: 608.778399 msecs“
(defn demo-memoize []
(time (dorun
(binding [slow-double (memoize slow-double)]
(calls-slow-double)))))
; memoize 를 동적 바인딩으로 calls-slow-double 수정없이 교체!
(demo-memoize)
"Elapsed time: 202.116447 msecs"
병행성 제어 Lib 4인방
ref + STM 제어 O 동기적 갱신
atom 제어 X 동기적 갱신
agent 제어 X 비동기적 갱신
var Thread 내부의 동적범위
Java lock 제어 O 동기적 갱신
Clojure 의 병행성
상태변화가 없는 함수형 모델
상태 변화가 존재하는 모델
병행성 API 를 사용하지 않은 부분
병행성API 를 사용한 부분
목차
병행성
공유된 자원
변수 만들기 실습
다른언어로 변수만들기
병행성 제어 Lib 4인방
ref , atom , agent , var
Example – Snake
Example – Lancet
Erlang 의 병행성
Example - Snake
(defn reset-game [snake apple]
(dosync (ref-set apple (create-apple))
(ref-set snake (create-snake)))
nil)
(defn update-direction [snake newdir]
(when newdir (dosync (alter snake turn newdir))))
(defn update-positions [snake apple]
(dosync
(if (eats? @snake @apple)
(do (ref-set apple (create-apple))
(alter snake move :grow))
(alter snake move)))
nil)
Example - Lancet
API locking
; START: create-runonce
(defn create-runonce [function]
(let [sentinel (Object.)
result (atom sentinel)]
(fn [& args]
(locking sentinel
(if (= @result sentinel)
(reset! result (function))
@result)))))
; END: create-runonce
Erlang 의 병행성
병행성 지향 프로그래밍
• Concurrency-oriented programming
• 처음부터 병행성을 고려해서 만든 언어.
• 공유 메모리가 없음
• 잠금 매커니즘 필요없음
• 쉽게 병행 프로그래밍 가능
Erlang
단일 할당 변수
1> X.
1: variable ‘X' is unbound
2> X = 50.
50
3> X = 23.
** exception error: no match of right
hand side value 23
• 변수가 아니라 write-once 변수
• 즉 한번만 bound 를 할 수 있음
Erlang
패턴매칭
X = 50.
• = 은 할당연산자가 아니라 패턴매칭연산
자.
• 오른쪽을 평가해서 그 결과를 왼쪽에 있는
패턴과 매치하라는 뜻.
Erlang
왜 단일 할당이 프로그램을
더 낫게 만드는가?
• 변수의 값을 바꿀수 있다?
– 누가 언제 바꿨는지 깔끔하게 알기힘듬.
– 복잡한 잠금 매커니즘 필요.
• 변수의 값을 바꿀수 없다?
– 불변상태의 메모리는 read 만 가능.
– 잠금 매커니즘이 필요없다.
• 즉 쉬운 병행 프로그래밍 가능
– 어떻게? 프로세스 메시지 전달 방식으로.
Erlang
Pure message passing language
• 순수 메시지 전달 언어
• 명령어 3개로 병행프로그래밍 가능
spawn : 프로세스 생성
! (send) : 메시지 보내기
receive : 메시지 받기
Erlang
$ erl
1> Pid = spawn(fun area:loop/0).
<0.45.0>
2> Pid ! {rect, 6, 10}.
rect : 60
3> Pid ! {circle, 5}.
circle : 78.5
4> Pid ! {triangle, 2, 4, 5}.
what is it? triangle?
Erlang
area.erl
-module(area).
-export([loop/0]).
loop() ->
receive
{rect, Width, Ht} ->
io:format(“rect : ~p~n”, [Width * Ht]),
loop();
{circle, R} ->
io:format(“circle : ~p~n”, [3.14 * R *
R]),
loop();
Other ->
io:format(“what is it? ~p?~n”, [Other]),
loop()
end.
Erlang
Reference
Programming Clojure – 인사이트
병행성 색연필
http://www.flickr.com/photos/kayyali/5121460008/
http://www.flickr.com/photos/queensy/4630729220/
Programming Erlang - 인사이트
감사합니다

Más contenido relacionado

La actualidad más candente

비전공자의 자바스크립트 도전기
비전공자의 자바스크립트 도전기비전공자의 자바스크립트 도전기
비전공자의 자바스크립트 도전기jeong seok yang
 
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)Sang Don Kim
 
Angular2 가기전 Type script소개
 Angular2 가기전 Type script소개 Angular2 가기전 Type script소개
Angular2 가기전 Type script소개Dong Jun Kwon
 
120908 레거시코드활용전략 4장5장
120908 레거시코드활용전략 4장5장120908 레거시코드활용전략 4장5장
120908 레거시코드활용전략 4장5장tedypicker
 
Secrets of the JavaScript Ninja - Chapter 3. Functions are Fundamental
Secrets of the JavaScript Ninja - Chapter 3. Functions are FundamentalSecrets of the JavaScript Ninja - Chapter 3. Functions are Fundamental
Secrets of the JavaScript Ninja - Chapter 3. Functions are FundamentalHyuncheol Jeon
 
Startup JavaScript 9 - Socket.IO 실시간 통신
Startup JavaScript 9 - Socket.IO 실시간 통신Startup JavaScript 9 - Socket.IO 실시간 통신
Startup JavaScript 9 - Socket.IO 실시간 통신Circulus
 
[하코사 세미나] 비전공자의 자바스크립트 도전기
[하코사 세미나] 비전공자의 자바스크립트 도전기 [하코사 세미나] 비전공자의 자바스크립트 도전기
[하코사 세미나] 비전공자의 자바스크립트 도전기 인권 김
 
프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oop프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oopYoung-Beom Rhee
 
학교에서 배우지 않는 C
학교에서 배우지 않는 C학교에서 배우지 않는 C
학교에서 배우지 않는 CHeesuk Kang
 
Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...
Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...
Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...Young-Beom Rhee
 
자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 NDC2012
자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 NDC2012자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 NDC2012
자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 NDC2012Esun Kim
 
3.4병행성 시간은 중요하다.
3.4병행성   시간은 중요하다.3.4병행성   시간은 중요하다.
3.4병행성 시간은 중요하다.aceigy6322
 
Api design for c++ pattern
Api design for c++ patternApi design for c++ pattern
Api design for c++ patternjinho park
 
Modern C++의 타입 추론과 람다, 컨셉
Modern C++의 타입 추론과 람다, 컨셉Modern C++의 타입 추론과 람다, 컨셉
Modern C++의 타입 추론과 람다, 컨셉HyunJoon Park
 
track2 04. MS는 Rx를 왜 만들었을까? feat. RxJS/ 네이버, 김훈민
track2 04. MS는 Rx를 왜 만들었을까? feat. RxJS/ 네이버, 김훈민 track2 04. MS는 Rx를 왜 만들었을까? feat. RxJS/ 네이버, 김훈민
track2 04. MS는 Rx를 왜 만들었을까? feat. RxJS/ 네이버, 김훈민 양 한빛
 
ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!WooYoung Cho
 
C++ Advanced 강의 4주차
 C++ Advanced 강의 4주차 C++ Advanced 강의 4주차
C++ Advanced 강의 4주차HyunJoon Park
 

La actualidad más candente (20)

Javascript
JavascriptJavascript
Javascript
 
비전공자의 자바스크립트 도전기
비전공자의 자바스크립트 도전기비전공자의 자바스크립트 도전기
비전공자의 자바스크립트 도전기
 
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
 
Angular2 가기전 Type script소개
 Angular2 가기전 Type script소개 Angular2 가기전 Type script소개
Angular2 가기전 Type script소개
 
Javascript 101
Javascript 101Javascript 101
Javascript 101
 
120908 레거시코드활용전략 4장5장
120908 레거시코드활용전략 4장5장120908 레거시코드활용전략 4장5장
120908 레거시코드활용전략 4장5장
 
Secrets of the JavaScript Ninja - Chapter 3. Functions are Fundamental
Secrets of the JavaScript Ninja - Chapter 3. Functions are FundamentalSecrets of the JavaScript Ninja - Chapter 3. Functions are Fundamental
Secrets of the JavaScript Ninja - Chapter 3. Functions are Fundamental
 
Startup JavaScript 9 - Socket.IO 실시간 통신
Startup JavaScript 9 - Socket.IO 실시간 통신Startup JavaScript 9 - Socket.IO 실시간 통신
Startup JavaScript 9 - Socket.IO 실시간 통신
 
[하코사 세미나] 비전공자의 자바스크립트 도전기
[하코사 세미나] 비전공자의 자바스크립트 도전기 [하코사 세미나] 비전공자의 자바스크립트 도전기
[하코사 세미나] 비전공자의 자바스크립트 도전기
 
Java lambda
Java lambdaJava lambda
Java lambda
 
프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oop프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oop
 
학교에서 배우지 않는 C
학교에서 배우지 않는 C학교에서 배우지 않는 C
학교에서 배우지 않는 C
 
Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...
Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...
Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...
 
자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 NDC2012
자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 NDC2012자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 NDC2012
자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 NDC2012
 
3.4병행성 시간은 중요하다.
3.4병행성   시간은 중요하다.3.4병행성   시간은 중요하다.
3.4병행성 시간은 중요하다.
 
Api design for c++ pattern
Api design for c++ patternApi design for c++ pattern
Api design for c++ pattern
 
Modern C++의 타입 추론과 람다, 컨셉
Modern C++의 타입 추론과 람다, 컨셉Modern C++의 타입 추론과 람다, 컨셉
Modern C++의 타입 추론과 람다, 컨셉
 
track2 04. MS는 Rx를 왜 만들었을까? feat. RxJS/ 네이버, 김훈민
track2 04. MS는 Rx를 왜 만들었을까? feat. RxJS/ 네이버, 김훈민 track2 04. MS는 Rx를 왜 만들었을까? feat. RxJS/ 네이버, 김훈민
track2 04. MS는 Rx를 왜 만들었을까? feat. RxJS/ 네이버, 김훈민
 
ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!
 
C++ Advanced 강의 4주차
 C++ Advanced 강의 4주차 C++ Advanced 강의 4주차
C++ Advanced 강의 4주차
 

Destacado

The Art of Computer Programming 2.3.2 Tree
The Art of Computer Programming 2.3.2 TreeThe Art of Computer Programming 2.3.2 Tree
The Art of Computer Programming 2.3.2 Treehyun soomyung
 
xUnitTestPattern/chapter8
xUnitTestPattern/chapter8xUnitTestPattern/chapter8
xUnitTestPattern/chapter8hyun soomyung
 
HTML5 & CSS3 - Video,Audio
HTML5 & CSS3 - Video,AudioHTML5 & CSS3 - Video,Audio
HTML5 & CSS3 - Video,Audiohyun soomyung
 
The Art of Computer Programming 1.2.5
The Art of Computer Programming 1.2.5The Art of Computer Programming 1.2.5
The Art of Computer Programming 1.2.5hyun soomyung
 
[페차쿠차] 배움의 기술
[페차쿠차] 배움의 기술[페차쿠차] 배움의 기술
[페차쿠차] 배움의 기술hyun soomyung
 
The Art of Computer Programming 2.4 다중연결구조
The Art of Computer Programming 2.4 다중연결구조The Art of Computer Programming 2.4 다중연결구조
The Art of Computer Programming 2.4 다중연결구조hyun soomyung
 
Domain Driven Design
Domain Driven DesignDomain Driven Design
Domain Driven Designhyun soomyung
 
프로그램은 왜 실패하는가?
프로그램은 왜 실패하는가?프로그램은 왜 실패하는가?
프로그램은 왜 실패하는가?hyun soomyung
 
Dependency Breaking Techniques
Dependency Breaking TechniquesDependency Breaking Techniques
Dependency Breaking Techniqueshyun soomyung
 
실전 윈도우 디버깅. Ch3. 디버거 해부
실전 윈도우 디버깅. Ch3. 디버거 해부실전 윈도우 디버깅. Ch3. 디버거 해부
실전 윈도우 디버깅. Ch3. 디버거 해부hyun soomyung
 
프로그래머의 길,멘토에게 묻다 2장
프로그래머의 길,멘토에게 묻다 2장프로그래머의 길,멘토에게 묻다 2장
프로그래머의 길,멘토에게 묻다 2장hyun soomyung
 
5장 그래프의 비밀 (Programming Game AI by Example)
5장 그래프의 비밀 (Programming Game AI by Example)5장 그래프의 비밀 (Programming Game AI by Example)
5장 그래프의 비밀 (Programming Game AI by Example)hyun soomyung
 
예제로 보는 Pattern 연상법
예제로 보는 Pattern 연상법예제로 보는 Pattern 연상법
예제로 보는 Pattern 연상법hyun soomyung
 
Scalable Web Architecture and Distributed Systems
Scalable Web Architecture and Distributed SystemsScalable Web Architecture and Distributed Systems
Scalable Web Architecture and Distributed Systemshyun soomyung
 

Destacado (17)

The Art of Computer Programming 2.3.2 Tree
The Art of Computer Programming 2.3.2 TreeThe Art of Computer Programming 2.3.2 Tree
The Art of Computer Programming 2.3.2 Tree
 
MapReduce
MapReduceMapReduce
MapReduce
 
이산수학 Ch.5
이산수학 Ch.5이산수학 Ch.5
이산수학 Ch.5
 
xUnitTestPattern/chapter8
xUnitTestPattern/chapter8xUnitTestPattern/chapter8
xUnitTestPattern/chapter8
 
HTML5 & CSS3 - Video,Audio
HTML5 & CSS3 - Video,AudioHTML5 & CSS3 - Video,Audio
HTML5 & CSS3 - Video,Audio
 
The Art of Computer Programming 1.2.5
The Art of Computer Programming 1.2.5The Art of Computer Programming 1.2.5
The Art of Computer Programming 1.2.5
 
[페차쿠차] 배움의 기술
[페차쿠차] 배움의 기술[페차쿠차] 배움의 기술
[페차쿠차] 배움의 기술
 
Hybrid app
Hybrid appHybrid app
Hybrid app
 
The Art of Computer Programming 2.4 다중연결구조
The Art of Computer Programming 2.4 다중연결구조The Art of Computer Programming 2.4 다중연결구조
The Art of Computer Programming 2.4 다중연결구조
 
Domain Driven Design
Domain Driven DesignDomain Driven Design
Domain Driven Design
 
프로그램은 왜 실패하는가?
프로그램은 왜 실패하는가?프로그램은 왜 실패하는가?
프로그램은 왜 실패하는가?
 
Dependency Breaking Techniques
Dependency Breaking TechniquesDependency Breaking Techniques
Dependency Breaking Techniques
 
실전 윈도우 디버깅. Ch3. 디버거 해부
실전 윈도우 디버깅. Ch3. 디버거 해부실전 윈도우 디버깅. Ch3. 디버거 해부
실전 윈도우 디버깅. Ch3. 디버거 해부
 
프로그래머의 길,멘토에게 묻다 2장
프로그래머의 길,멘토에게 묻다 2장프로그래머의 길,멘토에게 묻다 2장
프로그래머의 길,멘토에게 묻다 2장
 
5장 그래프의 비밀 (Programming Game AI by Example)
5장 그래프의 비밀 (Programming Game AI by Example)5장 그래프의 비밀 (Programming Game AI by Example)
5장 그래프의 비밀 (Programming Game AI by Example)
 
예제로 보는 Pattern 연상법
예제로 보는 Pattern 연상법예제로 보는 Pattern 연상법
예제로 보는 Pattern 연상법
 
Scalable Web Architecture and Distributed Systems
Scalable Web Architecture and Distributed SystemsScalable Web Architecture and Distributed Systems
Scalable Web Architecture and Distributed Systems
 

Similar a Clojure Chapter.6

7가지 동시성 모델 4장
7가지 동시성 모델 4장7가지 동시성 모델 4장
7가지 동시성 모델 4장HyeonSeok Choi
 
7가지 동시성 모델 - 3장. 함수형 프로그래밍
7가지 동시성 모델 - 3장. 함수형 프로그래밍7가지 동시성 모델 - 3장. 함수형 프로그래밍
7가지 동시성 모델 - 3장. 함수형 프로그래밍Hyunsoo Jung
 
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019min woog kim
 
0.javascript기본(~3일차내)
0.javascript기본(~3일차내)0.javascript기본(~3일차내)
0.javascript기본(~3일차내)Sung-hoon Ma
 
[A1]루비는 패셔니스타
[A1]루비는 패셔니스타[A1]루비는 패셔니스타
[A1]루비는 패셔니스타NAVER D2
 
[오픈소스컨설팅] 스카우터 사용자 가이드 2020
[오픈소스컨설팅] 스카우터 사용자 가이드 2020[오픈소스컨설팅] 스카우터 사용자 가이드 2020
[오픈소스컨설팅] 스카우터 사용자 가이드 2020Ji-Woong Choi
 
Promise in javascript
Promise in javascriptPromise in javascript
Promise in javascriptnamwook lim
 
Terraform을 이용한 Infrastructure as Code 실전 구성하기 :: 변정훈::AWS Summit Seoul 2018
 Terraform을 이용한 Infrastructure as Code 실전 구성하기 :: 변정훈::AWS Summit Seoul 2018 Terraform을 이용한 Infrastructure as Code 실전 구성하기 :: 변정훈::AWS Summit Seoul 2018
Terraform을 이용한 Infrastructure as Code 실전 구성하기 :: 변정훈::AWS Summit Seoul 2018Amazon Web Services Korea
 
Terraform을 이용한 Infrastructure as Code 실전 구성하기
Terraform을 이용한 Infrastructure as Code 실전 구성하기Terraform을 이용한 Infrastructure as Code 실전 구성하기
Terraform을 이용한 Infrastructure as Code 실전 구성하기JeongHun Byeon
 
스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오Taeoh Kim
 
[Hello world 오픈세미나]open api client개발
[Hello world 오픈세미나]open api client개발[Hello world 오픈세미나]open api client개발
[Hello world 오픈세미나]open api client개발NAVER D2
 
Javascript 교육자료 pdf
Javascript 교육자료 pdfJavascript 교육자료 pdf
Javascript 교육자료 pdfHyosang Hong
 
React native 개발 및 javascript 기본
React native 개발 및 javascript 기본React native 개발 및 javascript 기본
React native 개발 및 javascript 기본Tj .
 
분산 트랜잭션 - 큰힘에는 큰 책임이 따른다 [MongoDB]
분산 트랜잭션 - 큰힘에는 큰 책임이 따른다 [MongoDB]분산 트랜잭션 - 큰힘에는 큰 책임이 따른다 [MongoDB]
분산 트랜잭션 - 큰힘에는 큰 책임이 따른다 [MongoDB]MongoDB
 

Similar a Clojure Chapter.6 (20)

7가지 동시성 모델 4장
7가지 동시성 모델 4장7가지 동시성 모델 4장
7가지 동시성 모델 4장
 
7가지 동시성 모델 - 3장. 함수형 프로그래밍
7가지 동시성 모델 - 3장. 함수형 프로그래밍7가지 동시성 모델 - 3장. 함수형 프로그래밍
7가지 동시성 모델 - 3장. 함수형 프로그래밍
 
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
 
0.javascript기본(~3일차내)
0.javascript기본(~3일차내)0.javascript기본(~3일차내)
0.javascript기본(~3일차내)
 
[A1]루비는 패셔니스타
[A1]루비는 패셔니스타[A1]루비는 패셔니스타
[A1]루비는 패셔니스타
 
함수적 사고 2장
함수적 사고 2장함수적 사고 2장
함수적 사고 2장
 
Flyweight
FlyweightFlyweight
Flyweight
 
[오픈소스컨설팅] 스카우터 사용자 가이드 2020
[오픈소스컨설팅] 스카우터 사용자 가이드 2020[오픈소스컨설팅] 스카우터 사용자 가이드 2020
[오픈소스컨설팅] 스카우터 사용자 가이드 2020
 
javascript01
javascript01javascript01
javascript01
 
Promise in javascript
Promise in javascriptPromise in javascript
Promise in javascript
 
Terraform을 이용한 Infrastructure as Code 실전 구성하기 :: 변정훈::AWS Summit Seoul 2018
 Terraform을 이용한 Infrastructure as Code 실전 구성하기 :: 변정훈::AWS Summit Seoul 2018 Terraform을 이용한 Infrastructure as Code 실전 구성하기 :: 변정훈::AWS Summit Seoul 2018
Terraform을 이용한 Infrastructure as Code 실전 구성하기 :: 변정훈::AWS Summit Seoul 2018
 
Terraform을 이용한 Infrastructure as Code 실전 구성하기
Terraform을 이용한 Infrastructure as Code 실전 구성하기Terraform을 이용한 Infrastructure as Code 실전 구성하기
Terraform을 이용한 Infrastructure as Code 실전 구성하기
 
JDK 변천사
JDK 변천사JDK 변천사
JDK 변천사
 
Java8 람다
Java8 람다Java8 람다
Java8 람다
 
스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오
 
[Hello world 오픈세미나]open api client개발
[Hello world 오픈세미나]open api client개발[Hello world 오픈세미나]open api client개발
[Hello world 오픈세미나]open api client개발
 
Javascript 교육자료 pdf
Javascript 교육자료 pdfJavascript 교육자료 pdf
Javascript 교육자료 pdf
 
React native 개발 및 javascript 기본
React native 개발 및 javascript 기본React native 개발 및 javascript 기본
React native 개발 및 javascript 기본
 
분산 트랜잭션 - 큰힘에는 큰 책임이 따른다 [MongoDB]
분산 트랜잭션 - 큰힘에는 큰 책임이 따른다 [MongoDB]분산 트랜잭션 - 큰힘에는 큰 책임이 따른다 [MongoDB]
분산 트랜잭션 - 큰힘에는 큰 책임이 따른다 [MongoDB]
 
Whatischef korean
Whatischef koreanWhatischef korean
Whatischef korean
 

Más de hyun soomyung

아꿈사 매니저소개
아꿈사 매니저소개아꿈사 매니저소개
아꿈사 매니저소개hyun soomyung
 
Design Pattern - Multithread Ch10
Design Pattern - Multithread Ch10Design Pattern - Multithread Ch10
Design Pattern - Multithread Ch10hyun soomyung
 
The Art of Computer Programming 1.3.2 MIXAL
The Art of Computer Programming 1.3.2 MIXALThe Art of Computer Programming 1.3.2 MIXAL
The Art of Computer Programming 1.3.2 MIXALhyun soomyung
 
스터디그룹 패턴 (A PATTERN LANGUAGE FOR STUDY GROUPS)
스터디그룹 패턴 (A PATTERN LANGUAGE FOR STUDY GROUPS)스터디그룹 패턴 (A PATTERN LANGUAGE FOR STUDY GROUPS)
스터디그룹 패턴 (A PATTERN LANGUAGE FOR STUDY GROUPS)hyun soomyung
 

Más de hyun soomyung (6)

아꿈사 매니저소개
아꿈사 매니저소개아꿈사 매니저소개
아꿈사 매니저소개
 
MongoDB
MongoDBMongoDB
MongoDB
 
Design Pattern - Multithread Ch10
Design Pattern - Multithread Ch10Design Pattern - Multithread Ch10
Design Pattern - Multithread Ch10
 
The Art of Computer Programming 1.3.2 MIXAL
The Art of Computer Programming 1.3.2 MIXALThe Art of Computer Programming 1.3.2 MIXAL
The Art of Computer Programming 1.3.2 MIXAL
 
스터디그룹 패턴 (A PATTERN LANGUAGE FOR STUDY GROUPS)
스터디그룹 패턴 (A PATTERN LANGUAGE FOR STUDY GROUPS)스터디그룹 패턴 (A PATTERN LANGUAGE FOR STUDY GROUPS)
스터디그룹 패턴 (A PATTERN LANGUAGE FOR STUDY GROUPS)
 
Erlang
ErlangErlang
Erlang
 

Último

MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionKim Daeun
 
A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)Tae Young Lee
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스
 
Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Wonjun Hwang
 
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Kim Daeun
 
Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Wonjun Hwang
 

Último (6)

MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
 
A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차
 
Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)
 
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
 
Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)
 

Clojure Chapter.6

  • 1. Clojure 6장. Concurrency 아키텍트를 꿈꾸는 사람들 cafe.naver.com/architect1 현수명 soomong.net #soomong
  • 2. 목차 병행성 공유된 자원 변수 만들기 실습 다른언어로 변수만들기 병행성 제어 Lib 4인방 ref , atom , agent , var Example – Snake Example – Lancet Erlang 의 병행성
  • 4. 병행성! 어렵지 않음. 여러색의Thread 나 Process 를 띄우면 되요 문제는, 동시에 일어나는 일들 즉 도화지의 변화하는 상태를 어떻게 제어할 것인가
  • 5. 공유된 자원 공유된 자원? Clojure 에서 변수를 어떻게 만들지? 변수!
  • 6. 변수 만들기 실습 (def X 5) #’user/X X 5 (def X 3) #’user/X (def ^{:user/comment "A"} x 5 ) (meta #’user/x) {:ns #<Namespace user>, :name x, :file "NO_SOURCE_PATH", :line 30, :user/comment "A"} (def x 3) (meta #’user/x) {:ns #<Namespace user>, :name x, :file "NO_SOURCE_PATH", :line 32}
  • 8. Clojure 에서는? 데이터의 상태가 기본적으로 변경불가능 Clojure 에는 직접 변경할수있는 변수 없음 But. 예외가 있음 코드에서 명백하게 선언해야한다는 조건하에 간접적으로 변경 가능한 병행성 API 들을 제공
  • 9. 보통의 다른 언어들 모든 상태는 변경가능 상태변화가 코드전체에 뒤섞여 있음 병행성은Thread 로 구현 여러Thread 가 접근하는 경우 적절한 락을 통해 한번에 하나만 접근하도록 보호 int x = 5; x = 3;
  • 10. 목차 병행성 공유된 자원 변수 만들기 실습 다른언어로 변수만들기 병행성 제어 Lib 4인방 ref , atom , agent , var Example – Snake Example – Lancet Erlang 의 병행성
  • 11. 병행성 제어 Lib 4인방 ref + STM 제어 O 동기적 갱신 atom 제어 X 동기적 갱신 agent 제어 X 비동기적 갱신 var Thread 내부의 동적범위
  • 12. ref (def amount 3) (ref amount) (deref amount) java.lang.ClassCastException: java.lang.Integer cannot be cast to clojure.lang.IDeref (repl-1:33) (def ref_amount (ref amount)) #'user/ref_amount (deref ref_amount) 3 (alter ref_amount dec) java.lang.IllegalStateException: No transaction running (repl-1:40) ; 갱신할때 적절한 보호를 해주어야한다. ; Clojure 는 트랜잭션을 사용해서 보호 (dosync (alter ref_amount dec)) 2 Clojure 의 병행성 제어 Lib 1 API ref deref ref-set dosync alter commute :validator
  • 13. Clojure 의 병행성 제어 Lib 1 API ref deref ref-set dosync alter commute :validator (def ref_amount (ref amount)) #'user/ref_amount (deref ref_amount) 3 (ref-set ref_amount (def size 5) java.lang.IllegalStateException: No transaction running ; 갱신할때 적절한 보호를 해주어야한다. ; Clojure 는 트랜잭션을 사용해서 보호 (dosync (ref-set ref_amount (def size 5)) #'user/size ref
  • 14. Clojure 의 잠금 다른 언어에서는 데이터 보호를 위해 Lock 을 사용 Clojure 에서는 데이터 보호를 위해 Transaction 을 사용
  • 15. STM Software Transaction Memory Atomicity 원자성 Consistency 일관성 Isolation 고립성 Durability 영구성 Database 는 ACID Clojure 는 ACI
  • 16. ref Clojure 의 병행성 제어 Lib 1 API ref deref ref-set dosync alter commute :validator (def amount 3) (def ref_amount (ref amount)) #'user/ref_amount (def size 10) (def ref_size (ref size)) #'user/ref_size (dosync (ref-set ref_amount 6) (ref-set ref_size 20)) 20 ; 갱신이 하나의 트랜잭션 안에서 수행됨
  • 17. ref Clojure 의 병행성 제어 Lib 1 API ref deref ref-set dosync alter commute :validator (defstruct message :sender :text) (struct message "stu" "testmsg") {:sender "stu", :text "testmsg"} (def messages (ref ())) #'user/messages (defn native-add-msg [msg] (dosync (ref-set messages (cons msg @messages)))) (defn add-msg [msg] (dosync (alter messages conj msg))) (add-msg (struct message "user1" "hello")) ({:sender "user1", :text "hello"}) (add-msg (struct message "user2" "hoho")) ({:sender "user2", :text "hoho"} {:sender "user1", :text "hello"})
  • 18. ref Clojure 의 병행성 제어 Lib 1 API ref deref ref-set dosync alter commute :validator (defn add-msg-commute [msg] (dosync (commute messages conj msg))) ; 트랜잭션의 순서가 마음대로 재배열됨 (def validate-msg-list (partial every? #(and (:sender %) (:text %)))) (def messages (ref () :validator validate-msg-list)) ; 유효성 확인 추가 (add-message "not a valid msg") java.lang.IllegalStateException: Invalid reference state (add-message (struct message "stu" "good message")) ({:sender "stu", :text "good message"})
  • 19. 병행성 제어 Lib 4인방 ref + STM 제어 O 동기적 갱신 atom 제어 X 동기적 갱신 agent 제어 X 비동기적 갱신 var Thread 내부의 동적범위
  • 20. atom Clojure 의 병행성 제어 Lib 2 API atom reset! swap!(def amount 3) (def atom_amount (atom amount)) #'user/atom_amount (deref atom_amount) 3 (reset! atom_amount 0) 0 ; atom 은 트랜잭션 내에서 변경되는것이 아니기 때문에 ; dosync 를 사용할 필요 없음 ( 제어 X ) ; 동시에 2개의 atom 을 변경시키는것은 불가능! ; 이것이 ref 와의 차이점 (def atom_track (atom {:title "Hoot" :singer "SOSI"})) #'user/atom_track (swap! atom_track assoc :title "Huk")
  • 21. 병행성 제어 Lib 4인방 ref + STM 제어 O 동기적 갱신 atom 제어 X 동기적 갱신 agent 제어 X 비동기적 갱신 var Thread 내부의 동적범위
  • 22. agent Clojure 의 병행성 제어 Lib 3 API agent send await :validator clear-agent (def counter (agent 0)) #'user/counter (send counter inc) #<Agent@482d59a3: 1> ; 비동기적으로 갱신되므로 inc 를 나중에 처리한다 (deref counter) 1 ; 이값을 확인할때쯤이면 inc 는 이미 thread 풀에서 작업을 완료 ; dosync 를 사용할 필요 없음 ( 제어 X ) (await counter) ; agent 에 대한 작업완료시까지 현재 수행되는 thread 를 block
  • 23. agent Clojure 의 병행성 제어 Lib 3 API agent send await :validator clear-agent-errors (def counter (agent 0 :validator number?)) #'user/counter (send counter (fn [_] "boo")) #<Agent@5dde45e2 FAILED: 0> ; 유효성 검사에서 실패 (agent-errors counter) (#<IllegalStateException java.lang.IllegalStateException: Invalid reference state>) (clear-agent-errors counter) 0
  • 24. 병행성 제어 Lib 4인방 ref + STM 제어 O 동기적 갱신 atom 제어 X 동기적 갱신 agent 제어 X 비동기적 갱신 var Thread 내부의 동적범위
  • 25. var Clojure 의 병행성 제어 Lib 4 API binding set! (def foo 10) #'user/foo foo 10 (.start (Thread. (fn [] (println foo)))) nil 10 (binding [foo 42] foo) 42 (defn print-foo [] (println foo)) (let [foo “let foo”] (print-foo)) 10 (binding [foo “bound foo”] (print-foo)) bound foo
  • 26. var Clojure 의 병행성 제어 Lib 4 API binding set!(defn slow-double [n] (Thread/sleep 100) (* n 2)) (defn calls-slow-double [] (map slow-double [1 2 1 2 1 2])) (time (dorun (calls-slow-double))) "Elapsed time: 608.778399 msecs“ (defn demo-memoize [] (time (dorun (binding [slow-double (memoize slow-double)] (calls-slow-double))))) ; memoize 를 동적 바인딩으로 calls-slow-double 수정없이 교체! (demo-memoize) "Elapsed time: 202.116447 msecs"
  • 27. 병행성 제어 Lib 4인방 ref + STM 제어 O 동기적 갱신 atom 제어 X 동기적 갱신 agent 제어 X 비동기적 갱신 var Thread 내부의 동적범위 Java lock 제어 O 동기적 갱신
  • 28. Clojure 의 병행성 상태변화가 없는 함수형 모델 상태 변화가 존재하는 모델 병행성 API 를 사용하지 않은 부분 병행성API 를 사용한 부분
  • 29. 목차 병행성 공유된 자원 변수 만들기 실습 다른언어로 변수만들기 병행성 제어 Lib 4인방 ref , atom , agent , var Example – Snake Example – Lancet Erlang 의 병행성
  • 30. Example - Snake (defn reset-game [snake apple] (dosync (ref-set apple (create-apple)) (ref-set snake (create-snake))) nil) (defn update-direction [snake newdir] (when newdir (dosync (alter snake turn newdir)))) (defn update-positions [snake apple] (dosync (if (eats? @snake @apple) (do (ref-set apple (create-apple)) (alter snake move :grow)) (alter snake move))) nil)
  • 31. Example - Lancet API locking ; START: create-runonce (defn create-runonce [function] (let [sentinel (Object.) result (atom sentinel)] (fn [& args] (locking sentinel (if (= @result sentinel) (reset! result (function)) @result))))) ; END: create-runonce
  • 33. 병행성 지향 프로그래밍 • Concurrency-oriented programming • 처음부터 병행성을 고려해서 만든 언어. • 공유 메모리가 없음 • 잠금 매커니즘 필요없음 • 쉽게 병행 프로그래밍 가능 Erlang
  • 34. 단일 할당 변수 1> X. 1: variable ‘X' is unbound 2> X = 50. 50 3> X = 23. ** exception error: no match of right hand side value 23 • 변수가 아니라 write-once 변수 • 즉 한번만 bound 를 할 수 있음 Erlang
  • 35. 패턴매칭 X = 50. • = 은 할당연산자가 아니라 패턴매칭연산 자. • 오른쪽을 평가해서 그 결과를 왼쪽에 있는 패턴과 매치하라는 뜻. Erlang
  • 36. 왜 단일 할당이 프로그램을 더 낫게 만드는가? • 변수의 값을 바꿀수 있다? – 누가 언제 바꿨는지 깔끔하게 알기힘듬. – 복잡한 잠금 매커니즘 필요. • 변수의 값을 바꿀수 없다? – 불변상태의 메모리는 read 만 가능. – 잠금 매커니즘이 필요없다. • 즉 쉬운 병행 프로그래밍 가능 – 어떻게? 프로세스 메시지 전달 방식으로. Erlang
  • 37. Pure message passing language • 순수 메시지 전달 언어 • 명령어 3개로 병행프로그래밍 가능 spawn : 프로세스 생성 ! (send) : 메시지 보내기 receive : 메시지 받기 Erlang
  • 38. $ erl 1> Pid = spawn(fun area:loop/0). <0.45.0> 2> Pid ! {rect, 6, 10}. rect : 60 3> Pid ! {circle, 5}. circle : 78.5 4> Pid ! {triangle, 2, 4, 5}. what is it? triangle? Erlang
  • 39. area.erl -module(area). -export([loop/0]). loop() -> receive {rect, Width, Ht} -> io:format(“rect : ~p~n”, [Width * Ht]), loop(); {circle, R} -> io:format(“circle : ~p~n”, [3.14 * R * R]), loop(); Other -> io:format(“what is it? ~p?~n”, [Other]), loop() end. Erlang
  • 40. Reference Programming Clojure – 인사이트 병행성 색연필 http://www.flickr.com/photos/kayyali/5121460008/ http://www.flickr.com/photos/queensy/4630729220/ Programming Erlang - 인사이트