-
동기비동기, 스레드풀TIL 2021. 1. 30. 14:55
동기 비동기란?
동기
코드의 흐름이 하나로 흐른다.
비동기
코드의 흐름이 비동기 호출 시점에 나뉘며 호출한 main스레드는 자기 갈길 가고 작업 스레드도 main에서 빠져나와 자기의 갈길을 간다.
안드로이드 어플을 만들 때 사용한 적이 있는데 로그인 버튼을 활용할 때 사용했다.
처음에는 동기적으로 만들었다 -> 로그인 버튼을 누르고 서버에서 api를 받아올 때 동안 화면이 멈춘다.
그래서 비동기적으로 다시 만들었다 -> 서버에서 api를 받아올 동안 다른 행동이 가능해 졌다.
이처럼 비동기가 없는 곳이 없을 정도로 많은 곳에서 활용되고 있지만 너무 어려운 주제이다.
또 블록킹과 논 블록킹이란 무엇인가?
동기, 비동기 : 처리해야 할 작업들을 어떤 흐름으로 처리할 것인가에 대한 관점 콜백이 함수마다 있음
블록킹, 논 블록킹 : 처리되어야 하는 작업이 , 전체적인 작업 흐름을 막느냐 안 막느냐에 대한 관점 작업이 끝나면 콜백
블록킹은 작업을 시키고 기다리는 작업을 시킨 곳에서 흐름을 막고 작업이 끝나길 기다리는 것 스레드의 작업이 끝나면 return
논 블록킹은 작업을 시키고 작업의 흐름을 막지 않고 계속 가는 것 바로 return해주고 작업은 계속 함 main에서 중간중간 작업의 현재 진행상황을 물을 수 있음
내가 생각하는 것 동기 vs 비동기, 블로킹 vs 논블로킹 쉽게 이해하기
동기(sync) vs 비동기(async), 블로킹 vs 논블로킹 사전적 의미는 일단 치워두고 , 대조되는 개념들을 어떤 관점으로 봐야하는지 짧게 설명해보겠습니다. 동기 vs 비동기 : 처리해야 할 작업들을 어떠
siyoon210.tistory.com
homoefficio.github.io/2017/02/19/Blocking-NonBlocking-Synchronous-Asynchronous/
Blocking-NonBlocking-Synchronous-Asynchronous
꽤 자주 접하는 용어다. 특히나 요즘들어 더 자주 접하게 되는데, 얼추 알고는 있고 알고 있는게 틀린 것도 아니지만, 막상 명확하게 구분해서 설명하라면 또 만만치가 않은.. 그래서 찾아보면
homoefficio.github.io
자바 스레드 풀
https://www.wrapuppro.com/programing/view/jAuG3VNBCbGnQWU 이게 이벤트 방식인지는 잘 모르겠다.
특정 요청이 오면 작업을 스레드 풀에 넣어주는데...
스레드 풀은 매번 new로 스레드를 만들지 말고 여러 스레드를 가지고 있는 공간을 만드는 것이다.
개발자는 그 공간에 작업만 넣어주면 안에서 알아서 스레드를 할당하고 작업을 돌린다.
자바에서는 java.util.concurrent 패키지에서 Executorservice를 제공해줘 이것으로 만들 수 있다.
Executorservice executorservice = Excutores.newFixedThreadPool(2); //스레드가 2개인 스레드 풀 생성
작업이 돌아갈 풀을 만들었으니 작업을 만들어 보자
작업은 runable과 callable로 만들 수 있다.
차이점은 리턴 값이 없냐 , 있냐로 나뉜다.
Executorservice는 작업을 처리 요청에 execute와 submit을 사용하는데 excute는 작업 도중 예외가 나오면 그 스레드를 스레드 풀에서 제거한다. 그리고 새로운 스레드를 생성한다. -> 오버헤드가 발생한다.
submit은 예외가 발생해도 스레드를 제거하지 않고 재사용을 한다.
그래서 submit을 사용하는 게 바람직하다.
executorservice.submit(작업);
Executorservice는 작업을 받고 나면 바로 리턴을 넘겨준다(Future <?>).
여기서 위에서 본 runnable, clallable의 리턴 값을 얻을 수 있다.
runnalble 작업은 future.get()을 해도 null을 줄 것이고
callable작업은 리턴 값을 뭐로 했느냐에 따라 그 값을 줄 것이다.
만약 예외가 있는 작업이었다면 get을 하면 예외를 던져줄 것이다.
get을 호출했을 때 호출한 곳은 블록킹 상태가 된고 작업이 끝나기를 기다린다.
Executorservice는 get 말고도 여러 메서드를 제공한다. 작업을 취소시키거나, 작업의 완료 여부 등을 알 수 있다.
위에 있는 방식에 한 가지를 더 추가하면 콜백을 구현할 수 있다.
바로 작업 도중에 완료 여부를 통해 외부에 있는 함수를 호출하는 거다.
직접 구현해도 되고 java에서 제공하는 CompletionHandler <V, A>를 사용해도 된다.
인터페이스이기 때문에 바로 구현 객체를 만들어야 하는데 안에 함수는 성공, 실패 함수가 들어있다.
그냥 껍데기만 제공하는 거다. V는 결과값의 타입이고 A는 추가로 줄 참고 값이다.
www.clien.net/service/board/lecture/15872844
네트워크는 왜 이렇게 생긴걸까? 기본편 : 클리앙
요즘은 인터넷이 없는 컴퓨터는 상상할 수도 없죠. 근데 인터넷을 쓰려면 공유기에 LAN이니 WAN이니 하는 것들이 있고 UTP나 물리주소, IP주소, URL 같은 정보들을 접하게 됩니다. 그러다 네트워크
www.clien.net
'TIL' 카테고리의 다른 글
쉘 스크립트와 mysql (0) 2021.01.30 Docker란? (0) 2021.01.30 2021.01.30 기록장 (0) 2021.01.29 2021.01.29 기록장 (0) 2021.01.28 2021.01.28 기록장 (0) 2021.01.27