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
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