아빠는 개발자

[python] python 병렬처리 본문

Python

[python] python 병렬처리

father6019 2024. 3. 2. 16:51
728x90
반응형

파이썬에서는 여러 가지 방법을 사용하여 병렬 처리를 할 수 있습니다. 다음은 파이썬에서의 주요 병렬 처리 방법 몇 가지입니다.

 

threading 모듈:

  • threading 모듈은 스레드를 사용하여 병렬 처리를 제공합니다. 그러나 GIL(Global Interpreter Lock) 때문에 CPU-bound 작업에는 제한적입니다. GIL로 인해 파이썬 인터프리터에서 동시에 실행되는 스레드 수가 제한되기 때문입니다.
import threading

def worker():
    # Your code here

threads = []
for i in range(5):
    t = threading.Thread(target=worker)
    threads.append(t)
    t.start()

for t in threads:
    t.join()

 

multiprocessing 모듈:

  • multiprocessing 모듈은 프로세스를 사용하여 병렬 처리를 제공합니다. 각 프로세스는 독립적인 GIL을 가지기 때문에 CPU-bound 작업에서 유용합니다.
import multiprocessing

def worker():
    # Your code here

processes = []
for i in range(5):
    p = multiprocessing.Process(target=worker)
    processes.append(p)
    p.start()

for p in processes:
    p.join()

 

 

concurrent.futures 모듈:

  • concurrent.futures 모듈은 고수준의 인터페이스를 제공하여 스레드 또는 프로세스를 사용한 병렬 처리를 쉽게 할 수 있습니다.
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor

def worker():
    # Your code here

with ThreadPoolExecutor(max_workers=5) as executor:
    futures = [executor.submit(worker) for _ in range(5)]
    # Wait for all tasks to complete
    for future in futures:
        result = future.result()

# 또는 ProcessPoolExecutor를 사용할 수도 있습니다.

 

 

asyncio와 async/await (비동기 프로그래밍):

  • asyncio 모듈은 비동기 코드를 작성하고 실행할 수 있는 프레임워크를 제공합니다. 주로 I/O-bound 작업에서 사용되며, async/await 구문을 통해 비동기 코드를 작성할 수 있습니다.
import asyncio

async def worker():
    # Your code here

async def main():
    tasks = [worker() for _ in range(5)]
    await asyncio.gather(*tasks)

asyncio.run(main())

 

선택한 방법은 작업의 종류와 특성에 따라 다를 수 있습니다. I/O-bound 작업이라면 asyncio를 사용하는 것이 좋을 수 있고, CPU-bound 작업이라면 multiprocessing을 고려해보는 것이 좋습니다.

 

작업 셈플 

from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor

def process_doo(i):
    print(i)
def worker():
    for i in range(5):
        result = process_doo(i);

with ThreadPoolExecutor(max_workers=5) as executor:
    futures = [executor.submit(worker) for _ in range(5)]

    # Wait for all tasks to complete
    for future in futures:
        result = future.result()
728x90
반응형