동기 / 비동기, Block / Non-Block

김찬수·2023년 5월 21일
0

비동기 작업 CLASS

Task : Class 타입으로, 반환값이 없는 기본적인 비동기
Task<TResult> : Class 타입으로, TResult를 반환하는 비동기
ValueTask : Struct 타입으로, 한번만 대기할 수 있는 비동기
ValueTask<Tresult> : Struct 타입으로, TResult를 반환하는 비동기
  • 비동기 코드는 Task<.T> 및 Task를 사용함

  • async 키워드를 사용하면 본문에서 await 키워드를 사용할 수 있는 비동기 메서드로 반환해줌

  • await 키워드가 적용되면 이 키워드는 호출 메서드를 일시 중단하고 대기 작업이 완료할 때까지 제어 권한을 다시 호출자에게 양도

  • await는 비동기 메서드 내부에서만 사용할 수 있음

블로킹(Block) :

논블로킹(Non-Block) :

동기, 비동기, 블로킹, 논블로킹이란?

동기

  • 요청과 결과가 동시에 일어남
  • 설계가 매우 간단하고 직관적
  • 결과가 주어질 때까지 아무것도 못하고 결과값을 받을 때까지 대기해야 함
  • 호출된 함수에게 요청한 작업에 대해 완료 여부를 다져 순서대로 처리하는 것

비동기

  • 요청과 결과가 동시에 일어나지 않음
  • 동기에 비해 설계가 복잡함
  • 결과가 주어지는데 오랜 시간이 걸려도 기다리는 동안 다른일을 할 수 있어서 자원을 효율적으로 사용할 수 있음
  • 동기와 반대로 요청한 작업의 완료 여부를 따지지 않고, 순서에 상관없이 자신의 다음 일을 그대로 수행하는 것

비동기 / 동기콜리 함수의 작업 완료 여부를 누가 신경쓰느냐가 관심사이다.

블로킹

  • 콜러 함수는 요청한 일이 끝날 때까지 다른 일을 하지 않고 기다림
  • 다른 함수를 호출할 때, *제어권도 함께 넘겨주고 다른 함수가 일을 끝낸 후에 제어권을 돌려받음
  • 호출된 함수가 자신이 할 일을 모두 마칠 때까지 제어권을 계속 가지고 호출한 함수에게 바로 return하지 않으면 블로킹이다.

*제어권 : 함수를 실행시킬 수 있는 권리

논블로킹

  • 콜러 함수는 요청한 일이 진행되는 동안에 다른일을 할 수 있음
  • 다른 함수를 호출할 때, 제어권을 넘겨주었다가 바로 돌려 받음
  • 제어권을 바로 돌려 받기 때문에 다른 일을 할 수 있음
  • 호출된 함수가 자신이 할 일을 마치지 않았더라도 제어권을 바로 return하여 호출한 함수가 다른 일을 진행할 수 있도록 하면 논블로킹이다.

블로킹 / 논블로킹콜리 함수가 바로 리턴하는지가 관심사이다.

동기/비동기 + 블로킹/논블로킹 조합

동기와 블로킹, 비동기와 논블로킹은 유사하지만 다른 개념이다.
그래서 프로그램에서는 이 두 개념이 4가지로 조합되어서 사용된다.

  1. Sync Block (동기 + 블로킹)
  2. Async Block (비동기 + 블로킹)
  3. Sync Non-Block (동기 + 논블로킹)
  4. Async Non-Block (비동기 + 논블로킹)

동기 + 블로킹 조합

다른 일이 진행되는 동안 자신의 일을 처리하지 않고 (블로킹), 다른 일의 완료 여부를 바로 받아 순차적으로 처리하는 (동기) 방식이다. 주로 다른 일의 결과가 자신의 일에 영향을 주는 경우 사용한다.

실생활 동작 예시
햄버거집에 직원1, 직원2, 직원3 사장이 있다고 가정한다. 사장은 직원들에게 업무를 지시하고, 전체적인 흐름을 조율한다.

  1. 사장 : 직원1은 설거지 좀 해주세요. 식기가 없어서 음식이 못 나가요.
  2. 직원1 : 네 알겠습니다.(설거지 하러감)
  3. 사장 : (직원1이 설거지 하는 동안 아무것도 못하고 기다린다.)
  4. 직원1 : 사장님 설거지 다 했어요.
  5. 사장 : 수고했어요. 직원2는 패티 좀 튀겨주세요.
  6. 직원2 : 네 알겠습니다.(패티 튀기는 중)
  7. 사장 : (직원2가 패티 튀기는 동안 아무것도 못하고 기다린다.)

비동기 + 논블로킹 조합

다른 일이 진행되는 동안에도 자신의 일을 처리하고 (논블로킹), 다른 일의 결과를 바로 처리하지 않아서 일의 순서가 지켜지지 않는 (비동기) 방식이다. 다른 일의 결과가 자신의 일에 영향을 주지 않는 경우에 사용한다.

실생활 동작 예시

  1. 사장 : 직원1 설거지 해주세요.
  2. 사장 : 직원2 패티 튀겨주세요.
  3. 사장 : 직원3 매장 청소해주세요.
  4. 사장 : 저는 발주 작업할게요.
    (동시에 진행)
  5. 직원3 : 청소 끝났습니다.
  6. 직원1 : 설거지 끝났습니다.
  7. 사장 : 발주 끝났어요.
  8. 직원2 : 패티 나왔습니다.
    (업무량에 따라 일이 끝나는 시간이 다를 수 있음)

동기 + 논블로킹 조합

다른 일이 진행되는 동안에도 자신의 일을 처리하고 (논블로킹), 다른 일의 결과를 바로 처리해서 일을 순서대로 하는 (동기) 방식이다.

실생활 동작 예시
사장이 패티 튀기기, 햄버거 조립하기, 완성된 햄버거 손님에게 서빙하기를 직원 1,2,3 에게 시킬 때, 업무 특성상 특정 업무가 완료되어야 다른 업무를 진행할 수 있는 경우가 있다고 한다.

  1. 사장 : 직원1은 패티 튀겨주세요.
  2. 직원1 : 네 알겠습니다. (패티 튀기는중..)
  3. 사장 : 햄버거를 조립하려면 패티가 튀겨져야 되는데.. 직원1 패티 다 튀겼나요?
  4. 직원1 : 아직 튀기고 있습니다.
  5. 사장 : ..직원1 패티 다 튀겼나요?
  6. 직원1 : 아직 튀기고 있습니다.
  7. 직원1 : 패티 나왔습니다.
  8. 사장: 직원2는 햄버거 조립해주세요.
  9. 직원2 : 네 알겠습니다. (햄버거 조립중..)
  10. 사장 : 손님에게 서빙하려면 햄버거가 완성되어야 하는데.. 직원2 햄버거 조립 다 했나요?

비동기 + 블로킹 조합

비동기와 블로킹의 조합은 실무에서 마주하기 쉽지 않고, 비동기 + 블로킹 조합을 사용함으로써 얻을 수 있는 이점도 없어서 일부러 이 방식을 사용할 필요가 없다고 한다. 잘 와닿지도 않기 때문에 그냥 넘어가고, 후에 사용하게 된다면 추가하겠다..

참고자료1
참고자료2

profile
프로그래머 지망생

0개의 댓글