본문 바로가기
프로그래밍 언어(Programming Languages)/파이썬(Python)

[파이썬 Python]🧑‍💻 파이썬으로 이해하는 동시성, 스레딩, 병렬 처리 🛠️

by 데이터 벌집 2025. 1. 16.
반응형

🧑‍💻 파이썬으로 이해하는 동시성, 스레딩, 병렬 처리 🛠️

여러 작업을 동시에 처리하거나 성능을 최적화하려면 동시성(Concurrency), 스레딩(Threading), 병렬 처리(Parallelism)를 이해하는 것이 중요합니다! 🕒


이번 글에서는 공장 생산 라인을 예로 들어 이 개념들을 쉽게 설명하고, 이를 파이썬에서 구현하는 방법을 소개할게요! 🏭

 

[파이썬 Python]🧑‍💻 파이썬으로 이해하는 동시성, 스레딩, 병렬 처리 🛠️


1️⃣ 동시성 (Concurrency) 🕒

예시:
하나의 기계가 다양한 작업을 순차적으로 수행하는 상황을 떠올려 보세요.


예를 들어, 첫 번째로 부품을 조립하고, 잠시 대기하면서 다음 작업으로 도장 작업을 진행하며, 또 다른 부품 검사를 수행하는 식입니다.
작업이 병렬로 실행되지는 않지만, 적절히 전환하면서 전체 공정이 효율적으로 진행됩니다. ⚙️

 

➡️ 파이썬 구현 예제:

import asyncio

async def task(name, delay):
    print(f"{name} 작업 시작!")
    await asyncio.sleep(delay)
    print(f"{name} 작업 완료!")

async def main():
    task1 = asyncio.create_task(task("조립 작업", 2))
    task2 = asyncio.create_task(task("도장 작업", 3))

    print("작업이 동시 진행 중입니다...")

    await task1
    await task2

    print("모든 작업 완료!")

asyncio.run(main())

 

✨ 요약:

  • 동시성은 하나의 기계가 여러 작업을 전환하며 처리하는 방식입니다.
  • asyncio 라이브러리를 활용하여 I/O 바운드 작업에서 효율을 극대화할 수 있어요.

2️⃣ 스레딩 (Threading) 🧵

예시:


공장에 여러 작업 기계(스레드)가 있는 상황을 상상해 보세요.
하나의 기계는 조립만 하고, 다른 기계는 도장만 진행하며, 또 다른 기계는 검사를 수행합니다.
기계들이 작업 공간과 자원을 공유하면서 동시에 작업을 처리할 수 있지만, 동일한 부품을 기다리며 간혹 병목 현상이 발생할 수도 있어요. 🤔

 

➡️ 파이썬 구현 예제:

import threading
import time

def task(name, delay):
    print(f"{name} 작업 시작!")
    time.sleep(delay)
    print(f"{name} 작업 완료!")

if __name__ == '__main__':
    thread1 = threading.Thread(target=task, args=("조립 작업", 2))
    thread2 = threading.Thread(target=task, args=("도장 작업", 3))

    print("스레드 작업 시작...")

    thread1.start()
    thread2.start()

    thread1.join()
    thread2.join()

    print("모든 스레드 작업 완료!")
 

✨ 요약:

  • 스레딩은 여러 기계가 자원을 공유하며 동시에 작업을 진행하는 방식입니다.
  • 작업이 실제 병렬로 실행되기보다는 CPU가 빠르게 스레드 간 전환하여 동시 실행처럼 보입니다.

3️⃣ 병렬 처리 (Parallelism) 🏎️

예시:
공장에 각각 독립된 작업 공간과 기계를 가진 생산 라인이 여러 개 있는 상황을 떠올려 보세요.
한 라인은 조립만, 다른 라인은 도장만, 또 다른 라인은 검사를 수행하며 독립적으로 작업을 처리합니다.
이런 구조에서는 병목 현상 없이 모든 작업이 동시에 병렬로 실행될 수 있죠! 🚀

 

➡️ 파이썬 구현 예제:

import multiprocessing
import time

def task(name, delay):
    print(f"{name} 작업 시작!")
    time.sleep(delay)
    print(f"{name} 작업 완료!")

if __name__ == '__main__':
    process1 = multiprocessing.Process(target=task, args=("조립 작업", 2))
    process2 = multiprocessing.Process(target=task, args=("도장 작업", 3))

    print("프로세스 작업 시작...")

    process1.start()
    process2.start()

    process1.join()
    process2.join()

    print("모든 프로세스 작업 완료!")

✨ 요약:

  • 병렬 처리는 여러 CPU 코어를 활용해 작업을 동시에 독립적으로 실행합니다.
  • CPU 집약적인 작업에서는 multiprocessing 라이브러리가 큰 성능 향상을 제공합니다.

🧠 동시성 vs 스레딩 vs 병렬 처리 차이점

  • 동시성(Concurrency): 하나의 기계가 여러 작업을 효율적으로 전환하며 실행하는 방식입니다.
  • 스레딩(Threading): 여러 작업 기계(스레드)가 자원을 공유하며 작업을 수행합니다.
  • 병렬 처리(Parallelism): 독립된 생산 라인처럼 CPU 코어를 사용해 완전히 동시에 실행합니다.

🔍 선택 기준

  1. I/O 바운드 작업: 파일 읽기/쓰기나 네트워크 요청이 많은 경우 동시성(asyncio)을 사용하세요.
  2. 메모리를 공유하는 경량 작업: 스레딩(Threading)이 적합합니다.
  3. CPU 집약적인 작업: 병렬 처리(Parallelism)로 작업을 나누세요.

💡 결론:
동시성, 스레딩, 병렬 처리를 잘 활용하면 파이썬으로 효율적인 프로그램을 작성할 수 있습니다.

반응형