.net c# – 동기, 비동기
synchronous와 asynchronous, 동기와 비동기는 각 단어가 서로 반대되는 의미를 동시에 갖고 있어서 이해하기 피곤하다.
synchronous는 ‘동시에’라는 뜻이고 同期라고 번역한다.
1. At the same time, at the same frequency.
wiktionary
그런데 이게 컴퓨터 프로그래밍을 할 때에는 반대의 뜻으로 쓰인다. 여러 작업들이 동시에 처리되는 게 아니라 중간에 오래 걸리는 작업이 있으면 기다렸다가 순서대로 처리한다는 의미다.
2. (computing, of communication) Single-threaded; blocking; occurring in the same thread as other computations, thereby preventing those computations from resuming until the communication is complete.
아래의 코드에서 모든 작업들은 순서대로 처리되며 동시에 실행되는 건 아무 것도 없다.
private void Form1_Load(object sender, EventArgs e)
{
Method1();
Method2();
}
void Method1()
{
Thread.Sleep(5_000);
}
void Method2()
{
textBox1.AppendText("method2 complete\r\n");
}
synchronous의 반대말은 부정 접두사 a가 앞에 붙어서 asynchronous이며 ‘서로 다른 시간에’라는 뜻이고 非同期라고 번역한다.
1. Not synchronous; occurring at different times.
wiktionary
역시 컴퓨터 프로그래밍에서는 반대의 뜻으로 쓰인다. 여러 작업들이 순서에 상관없이 한꺼번에 처리된다는 의미다.
2. (computing, of a request or a message) Allowing the client to continue during processing.
3. (computing, communication) Having many actions occurring at a time, in any order, without waiting for each other.
at a time은 문맥에 따라 ‘차례로’와 ‘동시에’ 모두로 쓰일 수 있다. 그래서 위의 설명에 ‘순서에 상관없이 서로를 기다리지 않고 처리된다’는 설명이 부연되어 있다.
(in a single, continuous period of time): in a row, at a stretch
(simultaneously at each occurrence): at once, at one time, at the same time, simultaneously, together;
wiktionary
아래의 코드에서 두 개의 메떠드들은 동시에 실행된다. method1이 먼저 실행에 들어가 기다리는 작업을 하는 동안 이게 끝날 때를 기다리지 않고 method2가 실행에 들어가 이들은 동시에 작동한다.
private void Form1_Load(object sender, EventArgs e)
{
Method1();
Method2();
}
async Task Method1()
{
await Task.Delay(5_000);
}
void Method2()
{
textBox1.AppendText("method2 complete\r\n");
}
표준국어대사전을 보면 더 혼란스럽다. 동기에는 특별한 설명이 없는데 비동기에 대해서는 전산 용어로 따로 설명하고 있다.
정보·통신
앞에서 행하여진 事象이나 연산이 완료되었다는 신호를 받고 비로소 특정한 사상이나 연산이 시작되는 방식.
위의 첫 예제 즉 동기를 반대로 비동기라고 설명하고 있다. 구체적 사례를 개념으로 일반화하는 오류다.
async Task Method1()
{
await Task.Delay(5_000);
textBox1.AppendText("method1 complete\r\n");
}
위의 코드에서 둘째 줄은 위의 사전 설명처럼 첫째 줄을 기다렸다 실행된다. 그렇다고 이들 관계가 비동기인 건 아니다. method1과 method2의 관계가 비동기다. 위처럼 무언가가 오래 거릴 때 다른 작업들이 멈추지 않게 하기 위해 흔히 비동기 처리를 하는 거지 오래 걸리는 걸 기다렸다가 무언가를 하는 거 자체가 비동기는 아니다.