동기/ 비동기는 주로 어플리게이션에서 다뤄지는 개념이며, 다음 작업이 요청되는 시간과 관련이 있다.
동기(Synchronous)
- 현재 작업의 응답이 끝남과 동시에 다음 작업이 요청된다.
- 함수를 호출하는 곳에서 호출되는 함수가 결과를 반환할 때까지 기다린다.
- 작업 완료 여부를 계속해서 확인한다.
비동기(Asynchronous)
- 현재 작업의 응답이 끝나지 않은 상태에서 다음 작업이 요청된다.
- 함수를 호출하는 곳에서 결과를 기다리지 않고, 다른 함수(callback)에서 결과를 처리한다.
- 작업 완료 여부를 확인하지 않는다.
자바스크립트는 Single Thread 기반의 언어로 한번에 한 명력씩만 수행된다. 따라서 시간이 많이 걸리는 작업을 진행하는데 다른 작업을 동시에 실행할 수 없으면 굉장히 비효율적인 서비스를 만들 수 밖에 없다. 이런 약점을 보완하기 위해 자바스크립트는 비동기로 동작하며 콜백 함수를 사용해 Non-Blocking하게 프로그래밍을 하면 빠르게 동작할 수 있다.
이런 자바스크립트의 비동기 - 논블록킹 프로그래밍을 가능하게 해주는 것이 바로 메시지큐와 이벤트루프 모델이다.
동기와 비동기의 차이는 함수의 실행 결과를 어디서 처리하느냐에 따라 다르다.
동기: 함수를 실행하고, 결과를 함수를 호출한 곳에서 받아서 처리해야한다.
비동기: 함수를 실행하고, 결과를 함수를 호출한 곳에서 처리할 필요가 없다. 보통 콜백함수에서 처리하는 경우가 많다.
동기 예시
function add(a,b) {
return a + b;
}
const result = add(2, 3);
console.log(result); // 5
비동기 예시
function add(a,b) {
return a + b;
}
let result;
setTimeout(() => {
result = add(2, 3)
}, 2000);
console.log(result); // undefined
블로킹(Blocking)과 논블로킹(Non-Blocking)
블로킹/논블로킹은 주로 멀티 스래딩, I/O에서 사용되는 개념이며 함수 결과값의 리턴 시점과 함수의 제어권에 따라 차이가 난다.
블로킹: 제어권이 호출 함수에게 넘어가서 작업을 모두 마칠 때까지 제어권을 넘기지 않고 대기하게 만든다.
논블로킹: 제어권이 호출 함수와 동시에 넘어가서 호출한 함수가 다른 일을 할 수 있는 기회를 준다.
블로킹 예시
function loop() {
while(true) {}
return true;
}
var token = loop();
if (token) console.log("here");
위 코드의 경우 메인 실행 함수에서 loop 함수를 실행하면 "here"이라는 출력값은 볼 수 없다. 왜냐면 loop 함수의 제어권이 넘어가서 무한루프가 종료되지 않으면 값을 반환하지 않기 때문이다.
논블로킹 예시
function loop() {
while (true) {}
return true;
}
setTimeout(loop, 0);
console.log("here");
여기서는 "here"이라는 출력값을 볼 수 있는데 setTimeout 함수는 수행과 동시에 값이 리턴되며, loop함수가 콜백 함수로 실행되기 때문이다.
동기와 비동기에 관한 상세한 개념 설명은 다음 블로그 글을 참고하면 좋을것 같다.
동기(Synchronous)는 정확히 무엇을 의미하는걸까?
이번 포스팅에서는 I/O와 네트워크 등 전반적으로 다양한 모델에서 사용하는 개념인 가 정확히 무엇을 의미하는 것인지, 그리고 동기 방식과 비동기 방식의 차이에 대해서 한번 이야기 해보려고
evan-moon.github.io
참고 자료
[운영체제] 동기와 비동기, 블로킹과 논블로킹
동기(Synchronous)와 비동기(Asynchronous) 동기/비동기는 주로 어플리케이션에서 자주 다뤄지는 개념이며, 다음 작업이 요청되는 시간과 관련되어 있다. 동기(Synchronous) 현재 작업의 응답이 끝남과 동
cotak.tistory.com
[33-js-concepts] 9. 메시지 큐와 이벤트 루프 (Message Queue and Event Loop)
메시지 큐 & 이벤트 루프 기계어를 제외한 모든 언어는 컴파일 과정이 필요하다. 프로그래머가 작성한 코드라고 불리는 문자열은 컴파일러에게 한 줄씩 읽혀서 나름의 규칙에 의
corock.tistory.com
Blocking-NonBlocking-Synchronous-Asynchronous
꽤 자주 접하는 용어다. 특히나 요즘들어 더 자주 접하게 되는데, 얼추 알고는 있고 알고 있는게 틀린 것도 아니지만, 막상 명확하게 구분해서 설명하라면 또 만만치가 않은.. 그래서 찾아보면
homoefficio.github.io
What every programmer should know about Synchronous vs. Asynchronous Code
There are multiple ways of handling concurrency on programming languages. Some languages use various threads, while others use the asynchronous model. We are going to explore the latter in detail and provide examples to distinguish between synchronous vs.
adrianmejia.com
파이썬 실습 자료
Async IO in Python: A Complete Walkthrough – Real Python
This tutorial will give you a firm grasp of Python’s approach to async IO, which is a concurrent programming design that has received dedicated support in Python, evolving rapidly from Python 3.4 through 3.7 (and probably beyond).
realpython.com
[파이썬] asyncio로 비동기 처리하기
Engineering Blog by Dale Seo
www.daleseo.com
'📒 Tech Note > CS 기본기 뚝딱' 카테고리의 다른 글
[운영체제] IPC(Inter-Process Communication, 프로세스 간 통신)란? (0) | 2022.08.25 |
---|---|
[운영체제] 프로세스란? (0) | 2022.08.25 |