Upload
jung-hyun-soo
View
158
Download
0
Embed Size (px)
Citation preview
core.async 라이브러리
● clojure.core.async documentation● clojure/core.async github
고블록
고블록
순차적인코드를사건중심코드로재작성하는것
“ ” 제어의역전을통해실행하던스레드가블로킹되는대신 주차상태 로멈추고 , 다른처리를할수있게해준다 .
( 스레드와달리 ) 사용하는데많은비용이들지않는다 .
제어의역전과정1) 고블록내부에서작성된코드는하나의 State Machine 으로전환2) 채널에 Read/Write 시 ( 블로킹대신 ) 갖고있던스레드의통제를포기하고구석에주차(parking)3) 다음실행순서가돌아오면상태를전이시킨다 .4) 원래하던일을다른스레드에서계속수행한다 .
여러채널다루기
alt! 함수
둘이상의채널중하나를선택하여값을읽거나쓰게해준다 .
코드를효율적이며간결하게만들어준다 .1. 2 개의채널을만들고 ,
2. go 블록무한루프를돌며 alt! 를이용해두채널에서값을읽는다 .
여러채널다루기
timeout 함수
명시한밀리초만큼흐르면자동으로닫히는채널을리턴
Reified Timeout ( 구체화타임아웃 )
여러개의연결을하나로묶어서전체적으로소비하는시간에대해제한을줄때유용하다 .
한개의타임아웃을만든후 , 열에담긴각각의연결마다그타임아웃을전달
비동기적인폴링
폴링함수
정기적으로수행될 action 이 go 블록내부에서호출되어“ 주차하는함수 (<!)” 를호출할수있을것같다 .
예상과달리에러가발생하였다 .“ ” “ ” 주차하는호출 은고블록내에서 직접적 으로일어나야한다 .
비동기적인폴링
폴링매크로
<함수 > 대신 <매크로 > “ ” 를사용하여앞서보았던 폴링함수 의문제점해결
<매크로 > 는직접컴파일되는것이아니라컴파일될코드를리턴한다 .
즉 , 컴파일시확장되므로전달된코드는 inline 처리되어 poll 의 go 블록내에직접포함된다 .
매크로확장 (macroexpand) 를통해생성된코드확인가능
비동기적인폴링
폴링매크로
매크로확장 (macroexpand)
전달된코드가매크로자체내부에있는코드로어떻게이어졌는지 (Spliced),seconds# 가어떻게고유한이름으로전환되었는지알수있다 .
비동기적인 IO
비동기적 IO
연결마다하나의스레드를갖는것이아닌 ,
여러동작을한꺼번에시작한다음어느것이데이터가준비되었을때통보해오는방법
콜백호출이많아져문제가발생할수있다 .
core.async 로통합하여구현할예정
클로저스크립트
클로저스크립트
https://github.com/clojure/clojurescript
“ ” “ ” 자바바이트코드 가아닌 자바스크립트 로컴파일되는클로저버전
서버 / “ ” 클라이언트가 클로저 로작성된웹어플리케이션작성가능
클로저의 core.async 지원
콜백지옥해결가능
클로저스크립트의컴파일과정
클라이언트측 : 클로저스크립트를자바스크립트파일로컴파일
서버측 : 서버측코드컴파일후자바스크립트를포함한전체를서비스하기위한서버를실행
클로저스크립트
기존자바스크립트
“ ” 자바스크립트엔진은 단일스레드 사용
멀티스레드와관련있는 core.async 와의연관관계는 ?
Cooperative Multitasking ( 협동적인멀티태스킹 )
go 매크로사용
“ ” “ ” 실제로는 단일스레드 를사용하지만 여러개의스레드 를사용하는것처럼보이게구현
추가예제
추가예제
마우스클릭시이벤트처리
클릭하면크기가줄어들다가화면에서사라지게되는원을보여주는웹페이지
콜백중심의 Javascript 를 core.async “ ” 의채널중심으로옮김으로써 콜백지옥 에서탈출할수있다 .
클라이언트측소스코드
출처
7 가지동시성모델 (한빛미디어 , 폴부처지음 / 임백준옮김 )
Clojure Documentation : https://clojuredocs.org/core-library
에라토스테네스의체 Wikipedia : https://ko.wikipedia.org/wiki/ _에라토스테네스의 체