37
7 가가 가가가 가가 6 가 . 가가 가가가가 가가 가가가 가가가 - 가가가

7가지 동시성 모델 - 6장. 순차 프로세스 통신

Embed Size (px)

Citation preview

7 가지동시성모델6장 . 순차프로세스통신

아꿈사스터디 - 정현수

1일차

core.async 라이브러리

● clojure.core.async documentation● clojure/core.async github

채널

채널이란 ?

“스레드의안정성을제공하는 큐 (Queue)”

“ ” 이채널에참조를가진작업은 큐 에메세지추가 / 삭제가능하다 .

보내는개체와받는개체가서로알필요가없다 .

채널생성

채널

채널의버퍼 1 : 블로킹버퍼

채널은기본적으로버퍼를가지지않으며 , 메시지를수신할때까지블로킹된다 .

채널

채널의버퍼 1 : → 블로킹버퍼 채널에버퍼주기

close! 가없다면마지막 (<!! bc) 는새로운메시지를 수신할때까지대기할것이다 .

채널

채널의버퍼 2 : 버리는버퍼

채널

채널의버퍼 3 : 슬라이딩버퍼

고블록

고블록

순차적인코드를사건중심코드로재작성하는것

“ ” 제어의역전을통해실행하던스레드가블로킹되는대신 주차상태 로멈추고 , 다른처리를할수있게해준다 .

( 스레드와달리 ) 사용하는데많은비용이들지않는다 .

제어의역전과정1) 고블록내부에서작성된코드는하나의 State Machine 으로전환2) 채널에 Read/Write 시 ( 블로킹대신 ) 갖고있던스레드의통제를포기하고구석에주차(parking)3) 다음실행순서가돌아오면상태를전이시킨다 .4) 원래하던일을다른스레드에서계속수행한다 .

고블록

2. x, y 값을입력한후 ...

3. 결과값이출력되었다 .

1. 고블록을사용하지않을경우x, y 값을입력받을때까지블로킹된다 .

고블록

고블록을사용하여블로킹이발생하지않았다 . 이때고블록구문에는 <!!, >!! 대신 <!, >! 을사용하였

다 .

에라토스테네스의체

에라토스테네스의체

2일차

여러채널다루기

alt! 함수

둘이상의채널중하나를선택하여값을읽거나쓰게해준다 .

코드를효율적이며간결하게만들어준다 .1. 2 개의채널을만들고 ,

2. go 블록무한루프를돌며 alt! 를이용해두채널에서값을읽는다 .

여러채널다루기

timeout 함수

명시한밀리초만큼흐르면자동으로닫히는채널을리턴

Reified Timeout ( 구체화타임아웃 )

여러개의연결을하나로묶어서전체적으로소비하는시간에대해제한을줄때유용하다 .

한개의타임아웃을만든후 , 열에담긴각각의연결마다그타임아웃을전달

여러채널다루기

구체화타임아웃 : 에라토스테네스의체코드수정

무한루프를돌며 alt!! 에의해

(1) 새로운소수가준비되거나

(2) limit 가타임아웃이될때까지블로킹된다 .

비동기적인폴링

폴링함수

정기적으로수행될 action 이 go 블록내부에서호출되어“ 주차하는함수 (<!)” 를호출할수있을것같다 .

예상과달리에러가발생하였다 .“ ” “ ” 주차하는호출 은고블록내에서 직접적 으로일어나야한다 .

비동기적인폴링

폴링매크로

<함수 > 대신 <매크로 > “ ” 를사용하여앞서보았던 폴링함수 의문제점해결

<매크로 > 는직접컴파일되는것이아니라컴파일될코드를리턴한다 .

즉 , 컴파일시확장되므로전달된코드는 inline 처리되어 poll 의 go 블록내에직접포함된다 .

매크로확장 (macroexpand) 를통해생성된코드확인가능

비동기적인폴링

폴링매크로

매크로확장 (macroexpand)

전달된코드가매크로자체내부에있는코드로어떻게이어졌는지 (Spliced),seconds# 가어떻게고유한이름으로전환되었는지알수있다 .

비동기적인 IO

비동기적 IO

연결마다하나의스레드를갖는것이아닌 ,

여러동작을한꺼번에시작한다음어느것이데이터가준비되었을때통보해오는방법

콜백호출이많아져문제가발생할수있다 .

core.async 로통합하여구현할예정

비동기적인 IO

RSS 리더구현

비동기적인 IO

비동기적인 IO

비동기적인 IO

3일차

클로저스크립트

클로저스크립트

https://github.com/clojure/clojurescript

“ ” “ ” 자바바이트코드 가아닌 자바스크립트 로컴파일되는클로저버전

서버 / “ ” 클라이언트가 클로저 로작성된웹어플리케이션작성가능

클로저의 core.async 지원

콜백지옥해결가능

클로저스크립트의컴파일과정

클라이언트측 : 클로저스크립트를자바스크립트파일로컴파일

서버측 : 서버측코드컴파일후자바스크립트를포함한전체를서비스하기위한서버를실행

클로저스크립트

기존자바스크립트

“ ” 자바스크립트엔진은 단일스레드 사용

멀티스레드와관련있는 core.async 와의연관관계는 ?

Cooperative Multitasking ( 협동적인멀티태스킹 )

go 매크로사용

“ ” “ ” 실제로는 단일스레드 를사용하지만 여러개의스레드 를사용하는것처럼보이게구현

기본예제

기본예제

입력받은 2 개의메시지를각각 1초 , 1.5 초간격으로화면에출력

클라이언트측소스코드

기본예제

서버측소스코드

기본예제

실행방법

core.cljs 가있는폴더로이동

컴파일 : lein cljsbuild once target ⇒ 폴더생성

서버실행 : lein run

웹브라우저로접속

추가예제

추가예제

마우스클릭시이벤트처리

클릭하면크기가줄어들다가화면에서사라지게되는원을보여주는웹페이지

콜백중심의 Javascript 를 core.async “ ” 의채널중심으로옮김으로써 콜백지옥 에서탈출할수있다 .

클라이언트측소스코드

추가예제

서버측소스코드

추가예제

서버측소스코드

콜백지옥벗어나기

콜백지옥벗어나기예제

단계별로진행하는마법사 UI 구현

콜백을사용하지않고이벤트처리

콜백지옥벗어나기

출처

7 가지동시성모델 (한빛미디어 , 폴부처지음 / 임백준옮김 )

Clojure Documentation : https://clojuredocs.org/core-library

에라토스테네스의체 Wikipedia : https://ko.wikipedia.org/wiki/ _에라토스테네스의 체