#dart #flutter #cross-platform #mobile-app #web-app #desktop-app #server

제목[re]동기 vs 비동기 방식에 관한 질문2024-03-14 07:00
작성자 Level 10

동기와 비동기의 사전적 의미를 synchronous communication과 asynchronous communications에서 찾는게 이해하기 용이할 겁니다.


전자는 A와 B가 대화를 나눌때, A가 B에게 질문을 하면, A는 B가 질문에 답변을 할 때까지 기다리게 되고, 다른 질문(프로그램에서는 작업)을 하지 않습니다.

이후 B가 A에게 답변을 하면, A는 다시 질문을 하게 되고, 이 시간에 B는 질문을 하지 않습니다.

함수 호출로 대입하면, “함수를 호출한 자는 호출 결과가 올때까지 아무것도 하지 않고, 결과가 오기 만을 기다리게 됩니다”.

이 외에 다른 옵션은 없습니다.

따라서, 전체적인 측면에서, 한번에 하나의 작업 A 혹은 B가 발생하게 됩니다.


후자는 A와 B가 대화를 나눌때, A가 B에게 질문을 한 후, B가 답변을 할때 까지 비는 시간에 다른 일을 합니다.

즉, 사람 간의 대화라면, “OO씨 이것 좀 찾아봐 줄래요”라고 A가 B에게 이야기 한 후, 본인은 다른 작업을 한다고 보면 됩니다.

이후 B가 답변을 가지고 와서, “말씀하신 XX를 찾아본 결과를 가져왔습니다”라고 하면, 그제서야 A는 결과를 받아서, 그에 관련한 작업을 하는 것이지요.

혹은 가져온 결과를 일단 책상위에 두었다가, A가 필요한 시점에 볼 수도 있겠지요.

혹은 A가 다른 작업을 하다가, “이즈음 되면 B가 가져온 결과가 필요하니, 기다려 볼까”로 생각하고 일부 시간을 기다릴 수도 있습니다.

따라서 이때 중요한 것은, 특정 시간에 A와 B는 각자 다른일을 할 수 있다는 점 입니다.

함수 호출로 대입하면, “함수를 호출한 자는 호출 결과가 올때까지 기다리지 않고, (즉 아무것도 하지 않고 기다리는 wait 상태가 아니고), 다른 일을 수행할 수 있다”는 점 입니다.


여기서 await 구문은, 위에서 설명한, 다음 문장에 매핑되는 문법입니다.

>> 혹은 A가 다른 작업을 하다가, “이즈음 되면 B가 가져온 결과가 필요하니, 기다려 볼까”로 생각하고 일부 시간을 기다릴 수도 있습니다.

즉 A는 함수 호출 후, (1) 다른 일을 하거나, (2) 다른 일을 하다가 필요할 때 함수 호출 결과를 기다리거나, (3) 아무것도 안하고 답변을 기다릴 수 있습니다.

await는 이 경우, (2)와 (3)의 경우에 사용한다고 보면 됩니다.

이러한 이유로 질문하신 것처럼, 'await 구문을 사용한 부분(함수)은 동기 방식임을 나타내는 것이 아닌가?'라는 의문이 생기는 것은 정상적인 이해입니다.

여기서 중요한 것은, async 방식에서는 (1)을 할 수 있다는 점, 그리고 (2)의 경우도 “다른 일을 하다가”라는 부분이 있다는 점입니다.

실제 Dart 공식 사이트의 async, await 구문 설명 사이트에서도, 다음과 같이 두 문법을 설명하고 있으니, 본인이 잘 이해하고 있다고 안심해도 됩니다.

“the async and await keywords result in asynchronous code that looks a lot like synchronous code.”


이러한 배경에서,,, “함수를 호출한 A가 wait만 할 것인가, 아니면 위처럼 (1)(2)(3) 중 하나를 할 것인가”의 관점에서,

sync vs async를 synchronous communication과 asynchronous communications로 이해하기를 권장합니다.


인터넷에 찾아보면, 이런 그림이 많으니, 참조할 수 있습니다.

구글에서 검색 키워드를 asynchronous communication vs synchronous communication로 주고 이미지 검색 결과를 보면,

이에 대한 형태를 그림으로 보여주거나 표로 설명하는 자료를 쉽게 찾을 수 있습니다.


여기에 하나 더해서,,,


질문하신 내용중에 “작업이 순차적으로 진행되며 어떤 한 작업이 끝나고 나서 다음 작업으로 넘어가는 것”은 Batch 처리라고 주로 부릅니다.

현재도 정해진 일을 사람의 개입없이, 순차적으로 처리하는 경우 자주 사용하는 단어입니다.

https://en.wikipedia.org/wiki/Batch_processing


그리고 “다수의 작업이 동시에 진행되는 것”은 통상 multi-process 혹은 multi-thread 혹은 parallel-processing 이라고 합니다.

하나의 컴퓨터에서 asynchronous 동작을 한다면, 이는 기본적으로 “multi-process 혹은 multi-thread 혹은 parallel-processing”가 된다는 가정을 하고 있는 셈이지요.


도움이 되었으면 하네요. ^^

추가로 궁금한 사항이 있으면 언제든 질문 바랍니다. 

댓글