Python

[비동기 프로그래밍] Block, Async 기초 개념

Alex, Yoon 2022. 11. 29. 18:53
동시성(Concurrency), 병렬성(Parallelism) 은 같은 의미인가? 

 

Concurrency (동시성)

한 번에 여러 작업을 동시에 다루는 것을 의미

  • 클라이언트와 서버 간 통신
  • 시스템 디스크 파일 읽기/쓰기
  • 데이터베이스 쿼리 작업
  • API 사용

Parallelism (병렬성)

한 번에 여러 작업을 병렬적으로 처리하는 것을 의미

  • 비디오, 오디오 또는 이미지 처리
  • 컴퓨터 비전
  • 머신러닝
  • 딥러닝

CPU 바운드

한정된 CPU의 자원보다 더 많은 작업을 수행하게 되었을 때 막히고, 느려지는 현상

프로그램이 CPU 연산 때문에 막힘, 느려지는 것. 

  • 데이터 마이닝
  • 이미지 프로세싱
  • 암호화폐 마이닝

프로그램이 실행될 때 CPU가 연산을 해야하기 때문에 소요되는 시간에 차례차례 영향을 받는 것. 

이 경우에는 병렬적으로 처리하여 문제를 해결할 수 있다. 머신러닝, 딥러닝 영역에서 GPU가 많이 회자되고 사용되고 있는 이유. 

I/O 바운드 

INPUT / OUPUT 에 의해서 프로그램 속도가 제한됨을 의미. (EX. 파일 읽기, 쓰기, Web에서 이미지 다운로드) 

컴퓨터, 서버가 주체가 될 수 있음 -> 네트워크 I/O [컴퓨터 <-> 서버 간의 네트워크 통신]

이 경우에는 동시성으로 처리하여 문제를 해결할 수 있다. 관련 : async, 비동기, 코루틴 

블로킹 (Block)

위 설명한 바운드에 의해서 코드가 멈추게 되는 현상이 일어나는 것. 

논블로킹 (Non-Block)

바운드에 의해 코드가 멈추지 않는 것. 

동기 

코드가 반드시 작성한 '순서' 그대로 실행되는 것. 즉, 코드의 제어권과 결과값이 같이 움직이는 것. 

코드를 실행("요청")하고 결과값을 받아오기까지 기다리는 것. (그동안에는 위에서 설명한 블로킹 현상이 시간을 지연시킨다.) 

비동기 

코드가 반드시 작성한 '순서' 그대로 실행된다고 보장할 수 없는 것. 비동기 환경에서 코드의 제어권은 결과값과 다르게 움직인다. 

* tip : 무조건 비동기 함수가 좋을까? (CPU Bound vs I/O Bound)

처음 설명한 바운드 원인에 따라 이 얘기는 달라진다.

CPU 바운드로 인해 시간이 지연되는 경우에는 비동기 함수로 해결하는 방법보다는 '병렬 처리'로 해결하는 것이 더욱 효과적. 비동기적 코드(동시성 작업)I/O 작업에 의해 지연되는 바운드에만 허용된다.(효과를 볼 수 있다.)

메인루틴, 서브루틴, 코루틴 

하나의 진입점과 하나의 탈출점이 있는 루틴 

  1. 루틴 : 일련의 명령 (코드의 호출)
  2. 메인 루틴 : 프로그램 메인 코드의 호출
  3. 서브 루틴 : 우리가 알고있는 보통의 함수나 메소드(메인 루틴을 보조하는 역할) 

코루틴 : 서브 루틴의 일반화된 형태 

다양한 진입점과 다양한 탈출점이 있는 루틴

  • 서브루틴과 다르게 해당 로직들이 진행되는 중간에 멈추어서 특정 위치로 돌아갔다가 다시 코루틴에서 진행되었던 위치로 돌아와 나머지 로직을 수행.
  • 파이썬 비동기 함수는 '코루틴' 함수로 만들 수 있다. 
반응형