동시성 프로그래밍 하기 좋은 Clojure IT


잘 정리된 슬라이드. 언급된 내용을 ruby요소로 바꿔봤다. concurrent-ruby gem


1. 동시에 값 하나를 바꾸는 좋은 방법. 
- Atom > Atom

2. 동시에 값 여럿을 바꾸는 좋은 방법 
- Ref  TVar

3. 적은 리소스를 사용해서 동시 작업 간에 타이밍을 맞추는 방법
- Latch > CountDownLatch
- Future > Future
- Promise > Promise
- core.async의 go-routine, channel > Channel

Redux 미들웨어 비동기 구현해보기 IT

redux 미들웨어에서 시간이 걸리는 요청이 발생하면 어떻게 동작할까?
: 요청  > 미들웨어 > 시간이 걸리는 동작(완료될 때 까지 블록) > 미들웨어 > 응답(완료까지 블록)


응답이 도착할 때 까지 블록되는 것은 원치 않으므로

백그라운드에서 비동기로 상태가 반경되는 것이 좋겠다. 무엇이 필요할까?
  • 비동기를 고려한 상태 설계 : 시간이 소요되므로 처리상태(요청, 성공, 실패)와 처리시간을 기록할 수 있어야 한다.
  • 백그라운드 프로세싱 및 체이닝 : 백그라운드_처리(시간이 걸리는 작업).then(다음 작업).then(다음 작업)
미들웨어는 동기처리를 유지하지만, 액션에 따라 비동기로 동작하게 하자.


이를 가능하게 하는 비동기 액션 생성자와

함수형태의 비동기 액션을 구동시키는 thunk 미들웨어 두가지를 구현해봤다.



1) 비동기 액션 생성자 : fetch_posts(reddit)

액션생성자를 함수(동기와 비동기 dispatch 처리가 혼합된 코드블록)로 정의한다.
(리듀서는 상태변경에 대한 것이지 동기/비동기 메커니즘에 대한 것은 아니므로 reducer에 담지 않는다.
(액션에 따라서 동기/비동기를 달리하므로 액션내에 비동기 코드블록을 담도록 한다.


동기액션은 dispatch을 호출해서 미들웨어까지 동기적으로 처리완료 되도록 하고

비동기액션은 Concurrent.future {레딧json요청}.then{파싱}.then{dispatch} 처럼

백그라운드 작업을 순차적으로 진행한 뒤 dispatch를 호출해서 

시간이 소요되는 작업 처리-상태변경-미들웨어 적용이 백그라운드에서 진행되도록 한다.
(백그라운드 프로세싱과 체이닝은 concurrent-edge gem의 future, 체이닝을 사용했다.


2) thunk 미들웨어

코드블록 형태의 lambda 액션과 
기본 hash 액션을 구동하는 미들웨어가 필요하다.

thunk란 미들웨어를 만들고 미들웨어 스택에 추가한다.
logger로 찍은 stdout은 다음과 같다.
며칠간 redux에서 주제가 되는 것들을 대략적으로 루비로 구현해 봤다.
(combine_reducer, subscribe, 미들웨어 스택, 미들웨어 작성, 비동기 액션생성자, thunk 까지 완료.
(그 밖의 상태간 트랜잭션이나, 보일러 플레이트 축소등은 흥미가 떨어져 여기서 멈췄다.


Redux 유익하고 재
미있었다. 

Redux 미들웨어 스택기능 구현해보기 IT

미들웨어란 핸들러스택을 의미한다.

처리결과를 다음 핸들러에 연쇄적으로 전달하는 방식으로

복잡한 처리를 단순화시킬 수 있다. (요청 > 핸들러1~n > 어플리케이션)


미들웨어 스택은 핸들러 파이프 개념을 갖는다. 루비로 구현하면 다음과 같은식이다.

Redux도 복잡한 처리를 위해서 디스패처를 연쇄시킬 필요성이 생길 수 있다.

Redux의 미들웨어 스택을 위와 같은 느낌으로 다음과 같이 구현할 수 있다.
간단한 샘플

실행결과. (로거 > 레코더 > 어플리케이션 순으로 진입해서 역순으로 연쇄적으로 처리된다.)
특별한건 없다. 


덧, Redux 홈의 몽키패칭 > 숨기기 > 제거 > 미들웨어 완성 부분은 읽어볼만하다. 

덧, 시나트라 + Rack의 핸들러 스택은 다음과 같은 모양이다. 그럴듯하다.


1 2 3 4 5 6 7 8 9 10 다음