[python] λ©€ν‹°ν”„λ‘œμ„Έμ‹± Process μ‚¬μš©λ²• 및 μ½”λ“œ μ˜ˆμ‹œ | multiprocessing.Process | μ—¬λŸ¬ ν”„λ‘œμ„ΈμŠ€μ— μ„œλ‘œ λ‹€λ₯Έ μž‘μ—…μ„ ν• λ‹Ή

2024. 1. 7. 19:21Β·πŸ’» Programming/Python
λ°˜μ‘ν˜•
 

[python] λ©€ν‹°ν”„λ‘œμ„Έμ‹± Pool μ‚¬μš©λ²• 및 μ½”λ“œ μ˜ˆμ‹œ | multiprocessing.Pool | python 속도 ν–₯상

λ©€ν‹°ν”„λ‘œμ„Έμ‹±μ€ μ—¬λŸ¬ 개의 독립적인 ν”„λ‘œμ„ΈμŠ€λ₯Ό μƒμ„±ν•˜μ—¬ 각각의 ν”„λ‘œμ„ΈμŠ€κ°€ λ³‘λ ¬λ‘œ μž‘μ—…ν•˜λ„λ‘ ν•˜λŠ” 방식이닀. 각 ν”„λ‘œμ„ΈμŠ€λŠ” 독립적인 λ©”λͺ¨λ¦¬ 곡간을 κ°€μ§€λ©°, ν”„λ‘œμ„ΈμŠ€ κ°„ 톡신 (Inter-Process Co

mvje.tistory.com

 

νŒŒμ΄μ¬μ—μ„œ λ©€ν‹°ν”„λ‘œμ„Έμ‹±μ„ κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄ multiprocessing λͺ¨λ“ˆμ„ μ‚¬μš©ν•  수 있으며, 이 쀑 λŒ€ν‘œμ μΈ λ°©μ‹μœΌλ‘œ multiprocessing.Poolκ³Ό multiprocessing.Processκ°€ μžˆλ‹€. 이전 ν¬μŠ€νŒ…μ—μ„œλŠ” Pool을 μ€‘μ‹¬μœΌλ‘œ μ‚¬μš©ν•˜λŠ” 방법을 μ‚΄νŽ΄λ³΄μ•˜κ³ , μ΄λ²ˆμ—λŠ” Processλ₯Ό 직접 μ‚¬μš©ν•˜λŠ” 방식과 ν•¨κ»˜ 두 λ°©μ‹μ˜ 차이점을 비ꡐ해보렀 ν•œλ‹€.

 

Poolκ³Ό ProcessλŠ” λ©€ν‹°ν”„λ‘œμ„Έμ‹±μ„ κ΅¬ν˜„ν•˜λŠ” 두 κ°€μ§€ μ ‘κ·Ό λ°©μ‹μœΌλ‘œ, 상황에 따라 더 μ ν•©ν•œ 방식이 λ‹¬λΌμ§ˆ 수 μžˆλ‹€. 특히 각 ν”„λ‘œμ„ΈμŠ€μ— μ„œλ‘œ λ‹€λ₯Έ μž‘μ—…μ„ ν• λ‹Ήν•΄μ•Ό ν•˜λŠ” κ²½μš°μ—λŠ” Processλ₯Ό 직접 μ‚¬μš©ν•˜λŠ” 것이 μœ λ¦¬ν•˜λ‹€.


πŸ“Œ multiprocessing.Pool

βœ… κ°„νŽΈν•œ μΈν„°νŽ˜μ΄μŠ€
Pool ν΄λž˜μŠ€λŠ” μ—¬λŸ¬ 개의 ν”„λ‘œμ„ΈμŠ€λ₯Ό μƒμ„±ν•˜κ³ , 각 ν”„λ‘œμ„ΈμŠ€μ— μž‘μ—…μ„ λΆ„λ°°ν•˜λŠ” 과정을 κ°„λ‹¨ν•˜κ²Œ λ§Œλ“€μ–΄μ€€λ‹€. λ™μΌν•œ ν•¨μˆ˜λ₯Ό μ—¬λŸ¬ μž…λ ₯값에 λ³‘λ ¬λ‘œ μ μš©ν•  λ•Œ 특히 νŽΈλ¦¬ν•˜λ‹€.

 

βœ… μž‘μ—… λΆ„λ°° μžλ™ν™”
map, imap, apply λ“±μ˜ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ μž…λ ₯ 데이터λ₯Ό μžλ™μœΌλ‘œ λ‚˜λˆ  μ—¬λŸ¬ ν”„λ‘œμ„ΈμŠ€μ— λΆ„μ‚°μ‹œν‚€κ³ , κ²°κ³Όλ₯Ό λ³‘ν•©ν•˜λŠ” μž‘μ—…κΉŒμ§€ λ‚΄λΆ€μ μœΌλ‘œ μ²˜λ¦¬λœλ‹€.

 

βœ… ν”„λ‘œμ„ΈμŠ€ 수 μ œμ–΄
Pool(processes=n) ν˜•νƒœλ‘œ 생성 μ‹œ μ‚¬μš©ν•  ν”„λ‘œμ„ΈμŠ€μ˜ 개수λ₯Ό μ§€μ •ν•  수 μžˆλ‹€. μ΄λŠ” CPU μ½”μ–΄ 수 λ˜λŠ” λ³‘λ ¬μ²˜λ¦¬ν•  μž‘μ—… μˆ˜μ— 따라 μ‘°μ ˆν•  수 μžˆλ‹€.

 

# μ½”λ“œ 예제

from multiprocessing import Pool

def square_number(x):
    return x ** 2

if __name__ == "__main__":
    data = [1, 2, 3, 4, 5]

    with Pool(processes=3) as pool:
        results = pool.map(square_number, data)

    print("Results:", results)

 


πŸ“Œ multiprocessing.Process

βœ… μ„Έλ°€ν•œ μ œμ–΄κ°€ ν•„μš”ν•œ κ²½μš°μ— 적합
Process 클래슀λ₯Ό μ‚¬μš©ν•˜λ©΄ 각 ν”„λ‘œμ„ΈμŠ€λ₯Ό λͺ…μ‹œμ μœΌλ‘œ μƒμ„±ν•˜κ³ , μ‹œμž‘(start()), μ’…λ£Œ(terminate()), λŒ€κΈ°(join()) λ“±μ˜ λ™μž‘μ„ μ„Έλ°€ν•˜κ²Œ μ œμ–΄ν•  수 μžˆλ‹€. μž‘μ—… 흐름을 직접 관리해야 ν•˜μ§€λ§Œ, 그만큼 μœ μ—°ν•˜κ²Œ 섀계할 수 μžˆλ‹€λŠ” μž₯점이 μžˆλ‹€.

 

βœ… ν”„λ‘œμ„ΈμŠ€ κ°„ 톡신(IPC) κ΅¬ν˜„ ν•„μš”
Process λ°©μ‹μ—μ„œλŠ” ν”„λ‘œμ„ΈμŠ€ κ°„ 데이터 곡유λ₯Ό 직접 μ²˜λ¦¬ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€. 이λ₯Ό μœ„ν•΄ Queue, Pipe, Value, Array λ“±μ˜ IPC(Inter-Process Communication) λ©”μ»€λ‹ˆμ¦˜μ„ μ‚¬μš©ν•œλ‹€. 그만큼 κ΅¬ν˜„ λ‚œμ΄λ„λŠ” μ•½κ°„ λ†’μ§€λ§Œ, λ³΅μž‘ν•œ 데이터 흐름을 μ²˜λ¦¬ν•  수 μžˆλ‹€.

 

βœ… λ‹€μ–‘ν•œ μž‘μ—… μ²˜λ¦¬μ— 유리
Pool이 λ™μΌν•œ ν•¨μˆ˜λ₯Ό μ—¬λŸ¬ 데이터에 μ μš©ν•  λ•Œ μœ μš©ν•œ 반면, ProcessλŠ” μ„œλ‘œ λ‹€λ₯Έ μž‘μ—…μ„ λ³‘λ ¬λ‘œ μˆ˜ν–‰ν•΄μ•Ό ν•˜λŠ” κ²½μš°μ— μ ν•©ν•˜λ‹€. 예λ₯Ό λ“€μ–΄, ν•˜λ‚˜λŠ” μ„œλ²„λ₯Ό μ‹€ν–‰ν•˜κ³  λ‹€λ₯Έ ν•˜λ‚˜λŠ” 데이터 λ‘œκΉ…μ„ μˆ˜ν–‰ν•˜λŠ” μ‹μ˜ 병렬 μž‘μ—… μ²˜λ¦¬μ— 자주 쓰인닀.

 

# μ½”λ“œ 예제 - κΈ°λ³Έ

from multiprocessing import Process, Queue

def square_numbers(numbers, result_queue):
    squared_numbers = [x ** 2 for x in numbers]
    result_queue.put(squared_numbers)

if __name__ == "__main__":
    data = [1, 2, 3, 4, 5]
    result_queue = Queue()

    # 각 ν”„λ‘œμ„ΈμŠ€κ°€ λ…λ¦½μ μœΌλ‘œ μ‹€ν–‰λ˜λ©°, μ„œλ‘œ λ‹€λ₯Έ μž‘μ—…μ„ μˆ˜ν–‰
    num_of_processes = 3
    processes = [Process(target=square_numbers, args=(data, result_queue)) for _ in range(num_of_processes)]

    for process in processes:
        process.start()

    for process in processes:
        process.join()

    # κ²°κ³Όλ₯Ό νμ—μ„œ μˆ˜μ§‘
    results = [result_queue.get() for _ in processes]

    print("Results:", results)
  • 이 μ˜ˆμ‹œμ—μ„œλŠ” square_numbers ν•¨μˆ˜κ°€ κ°κ°μ˜ ν”„λ‘œμ„ΈμŠ€μ—μ„œ μ‹€ν–‰λ¨
  • 각 ν”„λ‘œμ„ΈμŠ€λŠ” λ…λ¦½μ μœΌλ‘œ data 리슀트의 숫자λ₯Ό μ œκ³±ν•˜κ³ , κ·Έ κ²°κ³Όλ₯Ό result_queue에 λ„£μŒ
  • 메인 ν”„λ‘œμ„ΈμŠ€μ—μ„œλŠ” κ° ν”„λ‘œμ„ΈμŠ€μ˜ κ²°κ³Όλ₯Ό μˆ˜μ§‘ν•˜μ—¬ μΆœλ ₯

 

# μ½”λ“œ 예제 - 각 ν”„λ‘œμ„ΈμŠ€μ—μ„œ μ„œλ‘œ λ‹€λ₯Έ μž‘μ—…μ„ μˆ˜ν–‰

from multiprocessing import Process, Queue

def square_numbers(numbers, result_queue):
    squared_numbers = [x ** 2 for x in numbers]
    result_queue.put(squared_numbers)

def cube_numbers(numbers, result_queue):
    cubed_numbers = [x ** 3 for x in numbers]
    result_queue.put(cubed_numbers)

if __name__ == "__main__":
    data = [1, 2, 3, 4, 5]
    result_queue = Queue()

    # 각 ν”„λ‘œμ„ΈμŠ€μ— λ‹€λ₯Έ ν•¨μˆ˜ ν• λ‹Ή
    process1 = Process(target=square_numbers, args=(data, result_queue))
    process2 = Process(target=cube_numbers, args=(data, result_queue))

    # ν”„λ‘œμ„ΈμŠ€ μ‹œμž‘
    process1.start()
    process2.start()

    # ν”„λ‘œμ„ΈμŠ€ μ’…λ£Œ λŒ€κΈ°
    process1.join()
    process2.join()

    # κ²°κ³Όλ₯Ό νμ—μ„œ μˆ˜μ§‘
    results = [result_queue.get(), result_queue.get()]

    print("Squared Results:", results[0])
    print("Cubed Results:", results[1])
  • ν”„λ‘œμ„ΈμŠ€λ₯Ό μ—¬λŸ¬κ°œ λ§Œλ“€κ³  각 ν”„λ‘œμ„ΈμŠ€λ§ˆλ‹€ μ„œλ‘œ λ‹€λ₯Έ ν•¨μˆ˜λ₯Ό target으둜 λ„£μ–΄μ£Όλ©΄ 각 ν”„λ‘œμ„ΈμŠ€μ—μ„œ μ„œλ‘œ λ‹€λ₯Έ ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•  수 μžˆλ‹€.
  • μ˜ˆμ‹œμ—μ„œλŠ” 숫자λ₯Ό μ œκ³±ν•˜λŠ” square_numbers ν•¨μˆ˜μ™€ 숫자λ₯Ό μ„Έμ œκ³±ν•˜λŠ” cube_numbers ν•¨μˆ˜λ₯Ό μ„œλ‘œ λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€λ‘œ μ‹€ν–‰
λ°˜μ‘ν˜•

'πŸ’» Programming > Python' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[python] Streamlit 으둜 데이터 μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ§Œλ“€κΈ°! | κ°„λ‹¨ν•œ λŒ€μ‹œλ³΄λ“œ & 웹데λͺ¨ νŽ˜μ΄μ§€ 개발  (1) 2024.07.08
[python] 파이썬 병렬 처리 | joblib μ‚¬μš©λ²• | λ©€ν‹°ν”„λ‘œμ„Έμ‹± | λ©€ν‹°μ“°λ ˆλ”©  (0) 2024.01.19
[python] λ©€ν‹°ν”„λ‘œμ„Έμ‹± Pool μ‚¬μš©λ²• 및 μ½”λ“œ μ˜ˆμ‹œ | multiprocessing.Pool | python 속도 ν–₯상  (0) 2024.01.07
[pandas] νŠΉμ • μ»¬λŸΌμ—μ„œ νŠΉμ • λ¬Έμžμ—΄μ΄ ν¬ν•¨λœ ν–‰ μ°ΎκΈ° | str.contains  (0) 2023.11.17
[pandas] νŠΉμ • 컬럼의 값이 곡백인 행을 μ œμ™Έν•˜λŠ” 방법 | dropna  (0) 2023.11.17
'πŸ’» Programming/Python' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • [python] Streamlit 으둜 데이터 μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ§Œλ“€κΈ°! | κ°„λ‹¨ν•œ λŒ€μ‹œλ³΄λ“œ & 웹데λͺ¨ νŽ˜μ΄μ§€ 개발
  • [python] 파이썬 병렬 처리 | joblib μ‚¬μš©λ²• | λ©€ν‹°ν”„λ‘œμ„Έμ‹± | λ©€ν‹°μ“°λ ˆλ”©
  • [python] λ©€ν‹°ν”„λ‘œμ„Έμ‹± Pool μ‚¬μš©λ²• 및 μ½”λ“œ μ˜ˆμ‹œ | multiprocessing.Pool | python 속도 ν–₯상
  • [pandas] νŠΉμ • μ»¬λŸΌμ—μ„œ νŠΉμ • λ¬Έμžμ—΄μ΄ ν¬ν•¨λœ ν–‰ μ°ΎκΈ° | str.contains
뭅즀
뭅즀
AI 기술 λΈ”λ‘œκ·Έ
    λ°˜μ‘ν˜•
  • 뭅즀
    CV DOODLE
    뭅즀
  • 전체
    였늘
    μ–΄μ œ
  • 곡지사항

    • ✨ About Me
    • λΆ„λ₯˜ 전체보기 (201) N
      • πŸ“– Fundamentals (33)
        • Computer Vision (9)
        • 3D vision & Graphics (6)
        • AI & ML (15)
        • NLP (2)
        • etc. (1)
      • πŸ› Research (66) N
        • Deep Learning (7)
        • Image Classification (2)
        • Detection & Segmentation (17)
        • OCR (7)
        • Multi-modal (4)
        • Generative AI (7) N
        • 3D Vision (3)
        • Material & Texture Recognit.. (8)
        • NLP & LLM (11)
        • etc. (0)
      • 🌟 AI & ML Tech (7)
        • AI & ML μΈμ‚¬μ΄νŠΈ (7)
      • πŸ’» Programming (86)
        • Python (18)
        • Computer Vision (12)
        • LLM (4)
        • AI & ML (18)
        • Database (3)
        • Apache Airflow (6)
        • Docker & Kubernetes (14)
        • μ½”λ”© ν…ŒμŠ€νŠΈ (4)
        • C++ (1)
        • etc. (6)
      • πŸ’¬ ETC (3)
        • μ±… 리뷰 (3)
  • 링크

  • 인기 κΈ€

  • νƒœκ·Έ

    OCR
    LLM
    VLP
    OpenCV
    AI
    deep learning
    파이썬
    ml
    pytorch
    generative ai
    object detection
    Computer Vision
    ChatGPT
    컴퓨터비전
    CNN
    κ°μ²΄κ²€μΆœ
    segmentation
    λ”₯λŸ¬λ‹
    객체 κ²€μΆœ
    ν”„λ‘¬ν”„νŠΈμ—”μ§€λ‹ˆμ–΄λ§
    Python
    pandas
    material recognition
    OpenAI
    multi-modal
    airflow
    Text recognition
    도컀
    nlp
    3D Vision
  • 졜근 λŒ“κΈ€

  • 졜근 κΈ€

  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.3
뭅즀
[python] λ©€ν‹°ν”„λ‘œμ„Έμ‹± Process μ‚¬μš©λ²• 및 μ½”λ“œ μ˜ˆμ‹œ | multiprocessing.Process | μ—¬λŸ¬ ν”„λ‘œμ„ΈμŠ€μ— μ„œλ‘œ λ‹€λ₯Έ μž‘μ—…μ„ ν• λ‹Ή
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”