본문 바로가기

공부

블록킹(Blocking), 논블록킹(Non-Blocking)이란?

블록킹과 논블록킹은 코드 실행의 흐름과 자원의 사용 방식에 관한 개념

  • 블록킹 (Blocking): 블록킹은 해당 작업이 완료될 때까지 프로그램의 실행이 멈추는 방식
    예를 들어, 데이터베이스에서 데이터를 가져오는 동안 다른 작업을 수행할 수 없고, 데이터가 준비될 때까지 기다려야함 일반적으로 동기식 호출과 연관이 있으며, 처리 순서가 직관적

  • 논블록킹 (Non-Blocking): 논블록킹 호출은 작업이 즉시 반환, 해당 작업이 완료될 때까지 기다리지 않는 방식
    프로그램은 다른 작업을 계속해서 수행할 수 있으며, 작업이 완료되면 그 결과를 처리
    비동기식 호출과 관련이 있으며, 자원 활용을 최적화 가능

장점:

  • 블록킹:
    • 코드가 간단하고 이해하기 쉬움
    • 직관적인 흐름으로 디버깅이 용이
    • 요청이 적거나 성능이 중요한 요소가 아닌 경우 적합
  • 논블록킹:
    • 자원을 효율적으로 사용하여 더 많은 작업을 동시에 처리 가능
    • 시스템의 응답성
    • 대규모 병렬 처리가 필요한 애플리케이션에 적합

단점:

  • 블록킹:
    • 자원 대기 시간이 길어질 수 있음
    • 여러 요청을 동시에 처리할 때 성능 저하 발생 가능
    • 시스템의 응답성이 낮아질 수 있음
  • 논블록킹:
    • 코드가 복잡해지고 디버깅이 어려울 수 있음
    • 오류 처리와 예외 관리가 복잡해질 수 있음
    • 코드의 비동기 흐름을 이해하기 어렵다.

 

사용 예시:

  • 블록킹 사용 예시 - 파일 읽기:
    - 파일이 완전히 읽히기 전까지 프로그램이 다른 작업을 하지 않음
with open('file.txt', 'r') as file:
    data = file.read()  # 파일을 다 읽을 때까지 프로그램이 멈춤 (블록킹)
    print(data)
  • 논블록킹 사용 예시 - 비동기 파일 읽기 (Python Asyncio):
    - 파일을 읽는 동안에도 다른 작업을 동시에 수행 가능
import asyncio
import aiofiles

async def read_file():
    async with aiofiles.open('file.txt', 'r') as file:
        data = await file.read()  # 파일을 읽는 동안 다른 작업을 할 수 있음 (논블록킹)
        print(data)

asyncio.run(read_file())
  • 논블록킹 사용 예시 - 비동기 파일 읽기 (Python Asyncio): 논블록킹 사용 예시 - Node.js HTTP 서버:
    - 서버는 요청을 즉시 반환하고, 2초 후에 응답을 보냄
    - 이 동안 다른 요청 처리 가능
const http = require('http');

const server = http.createServer((req, res) => {
  setTimeout(() => {
    res.end('Hello World');  // 요청 처리가 논블록킹 방식으로 이루어짐
  }, 2000);
});

server.listen(3000, () => {
  console.log('Server running on port 3000');
});

'공부' 카테고리의 다른 글

서버 스케줄링이란  (0) 2024.08.31
시스템 설계란  (0) 2024.08.31
Spring과 Node.js  (1) 2024.08.30
백엔드 아키텍처란  (2) 2024.08.30
RDBMS와 NoSQL의 차이  (1) 2024.08.29