๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Langauge/Python

[Python] ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ

728x90
๋ฐ˜์‘ํ˜•
๐Ÿ ๋ณธ ๊ฒŒ์‹œ๊ธ€์€ Python 3.11.0 ํ™˜๊ฒฝ์—์„œ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!

 

์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•ด ํ›จ์”ฌ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

Multi-Processing

4๊ฐœ์˜ ์ž‘์—…์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์‹ฑ์„ ํ†ตํ•ด ๋ณ‘๋ ฌ๋กœ 4๊ฐœ์˜ ์ž‘์—…์„ ๋™์‹œ์— ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์‹ฑ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ๋‚˜๋ˆ„์–ด ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.

  • ์ž์›์„ ๋…๋ฆฝ์ ์œผ๋กœ ์ ์œ ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•ˆ์ •์ ์ด๋‹ค.
  • ๊ฐœ๋ณ„์ ์œผ๋กœ ์ž์›์„ ์ ์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌ์†Œ์Šค ์š”๊ตฌ๋Ÿ‰์ด ํฌ๋‹ค.

 

ํ•œ๋ฒˆ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋Š” CPU Core์˜ ๊ฐœ์ˆ˜์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค.

import time
from multiprocessing import Pool

def cpu_intensive_task(n):
    result = 0
    for i in range(n):
        result += i ** 2
    return result

if __name__ == "__main__":
    start_time = time.time()
    results = []
    for _ in range(4):  # 4๊ฐœ์˜ ์ž‘์—…์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ˆ˜ํ–‰
        result = cpu_intensive_task(10**6)
        results.append(result)
    end_time = time.time()

    print("Results:", results)
    print("Sigle Processing:", end_time - start_time)


    start_time = time.time()
    with Pool(processes=4) as pool:  # 4๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑ
        results = pool.map(cpu_intensive_task, [10**6] * 4)  # 4๊ฐœ์˜ ์ž‘์—…์„ ๋ณ‘๋ ฌ๋กœ ์ˆ˜ํ–‰
    end_time = time.time()

    print("Results:", results)
    print("Multi processing:", end_time - start_time)

 

 

Multi-Threading

I/O ์ž‘์—…์„ ์—ฌ๋Ÿฌ๊ฐœ ํ•ด์•ผํ•  ๋•Œ๋Š” ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋”ฉ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋”ฉ์€ ํ•˜๋‚˜์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ž‘์—…์„ ์ž‘๊ฒŒ ๋‚˜๋ˆ ์„œ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.

  • ์ž์›์„ ๊ณต์œ (ํ•˜๋‚˜์˜ ๋ฉ”๋ชจ๋ฆฌ)ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋‚˜์˜ ์ž‘์—…์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋‹ค๋ฅธ ์ž‘์—…๋„ ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค. 

 

import time
import threading

def io_intensive_task(n):
    time.sleep(n)  # I/O ์ž‘์—…์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ (n์ดˆ ๋Œ€๊ธฐ)
    print(f"Task {n} completed")

if __name__ == "__main__":
    start_time = time.time()

    for i in range(1, 5):  # 1์ดˆ, 2์ดˆ, 3์ดˆ, 4์ดˆ ๋Œ€๊ธฐ ์ž‘์—…
        io_intensive_task(i)
    end_time = time.time()
    print("Single-Threading:", end_time - start_time)


    start_time = time.time()
    threads = []
    for i in range(1, 5):  # 1์ดˆ, 2์ดˆ, 3์ดˆ, 4์ดˆ ๋Œ€๊ธฐ ์ž‘์—…
        thread = threading.Thread(target=io_intensive_task, args=(i,))
        threads.append(thread)
        thread.start()  # ์Šค๋ ˆ๋“œ ์‹œ์ž‘

    for thread in threads:
        thread.join()  # ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ

    end_time = time.time()
    print("Multi-Threading:", end_time - start_time)

 

 

์ด ๋‘๊ฐœ์˜ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ์ ์ ˆํžˆ ์กฐํ•ฉํ•˜๋ฉด ํ›จ์”ฌ ๋น ๋ฅธ ์‹œ๊ฐ„์— ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

import time
import multiprocessing
import threading

def io_intensive_task(n):
    time.sleep(n)  # I/O ์ž‘์—…์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ (n์ดˆ ๋Œ€๊ธฐ)
    print(f"Thread Task {n} completed")

def process_function(num_threads):
    threads = []
    for i in range(1, num_threads + 1):
        thread = threading.Thread(target=io_intensive_task, args=(i,))
        threads.append(thread)
        thread.start()  # ์Šค๋ ˆ๋“œ ์‹œ์ž‘

    for thread in threads:
        thread.join()  # ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ

if __name__ == "__main__":
    start_time = time.time()
    num_tasks = 6  # ์ด ์ž‘์—… ์ˆ˜

    for i in range(1, num_tasks + 1):
        io_intensive_task(i)  # ๊ฐ ์ž‘์—… ์‹คํ–‰

    end_time = time.time()
    print(f"Default: {end_time - start_time:.4f}")

    start_time = time.time()
    num_processes = 2  # ํ”„๋กœ์„ธ์Šค ์ˆ˜
    num_threads_per_process = 3  # ๊ฐ ํ”„๋กœ์„ธ์Šค์—์„œ ์‹คํ–‰ํ•  ์Šค๋ ˆ๋“œ ์ˆ˜

    processes = []
    for _ in range(num_processes):
        process = multiprocessing.Process(target=process_function, args=(num_threads_per_process,))
        processes.append(process)
        process.start()  # ํ”„๋กœ์„ธ์Šค ์‹œ์ž‘

    for process in processes:
        process.join()  # ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ

    end_time = time.time()
    print(f"multiprocessing and multithreading:{end_time - start_time:.4f}")

728x90
๋ฐ˜์‘ํ˜•