Python 멀티프로세싱을 이용한 병렬 실행

PythonBeginner
지금 연습하기

소개

Python multiprocessing 은 높은 처리 능력을 요구하는 Python 프로그램의 실행 속도를 크게 향상시킬 수 있는 강력한 도구입니다. 이 랩에서는 Python multiprocessing 에 대해 배우고, 이를 사용하여 프로세스를 병렬로 실행하는 방법을 익힐 것입니다. 간단한 예제부터 시작하여 점차적으로 더 복잡한 예제로 나아갈 것입니다.

간단한 멀티프로세싱 프로그램 생성

Python 에서 multiprocessing 에 대해 배우는 첫 번째 단계는 작동 방식을 보여주는 간단한 프로그램을 만드는 것입니다. 이 프로그램에서는 단일 인수를 받아 해당 숫자의 제곱을 반환하는 함수를 만들 것입니다. 그런 다음 multiprocessing 을 사용하여 이 함수를 여러 프로세스에서 실행할 것입니다.

square.py를 완성하십시오.

import multiprocessing

def square(x):
    return x * x

if __name__ == '__main__':
    pool = multiprocessing.Pool(processes=4)
    results = pool.map(square, range(10))
    print(results)

이 코드는 4 개의 프로세스 풀을 생성하고 map() 함수를 사용하여 square() 함수를 0 부터 9 까지의 범위에 있는 각 숫자에 적용합니다. 그런 다음 결과가 콘솔에 출력됩니다.

멀티프로세싱을 사용하여 처리 속도 향상

이제 Python 에서 multiprocessing 이 어떻게 작동하는지 이해했으므로, 더 복잡한 예제로 넘어갈 수 있습니다. 이 예제에서는 multiprocessing 을 사용하여 대량의 숫자 목록 처리 속도를 높일 것입니다.

complex_square.py를 완성하십시오.

import multiprocessing

def square(x):
    return x * x

if __name__ == '__main__':
    with multiprocessing.Pool(processes=4) as pool:
        results = pool.map(square, range(1000000))
    print(results[:10])

이 코드는 4 개의 프로세스 풀을 생성하고 map() 함수를 사용하여 square() 함수를 0 부터 999999 까지의 범위에 있는 각 숫자에 적용합니다. with 문은 처리가 완료되면 프로세스 풀이 제대로 닫히도록 하는 데 사용됩니다. 그런 다음 처음 10 개의 결과가 콘솔에 출력됩니다.

프로세스 간 통신 (Inter-Process Communication)

경우에 따라 Python 에서 multiprocessing 을 사용할 때 프로세스 간에 통신해야 할 수 있습니다. 이 예제에서는 multiprocessing.Queue() 함수를 사용하여 프로세스 간에 공유 큐를 생성합니다.

multiprocessing_queue.py를 완성하십시오.

import multiprocessing

def producer(queue):
    for i in range(10):
        queue.put(i)

def consumer(queue):
    while True:
        item = queue.get()
        if item is None:
            break
        print(item)

if __name__ == '__main__':
    queue = multiprocessing.Queue()
    process_producer = multiprocessing.Process(target=producer, args=(queue,))
    process_consumer = multiprocessing.Process(target=consumer, args=(queue,))
    process_producer.start()
    process_consumer.start()
    process_producer.join()
    queue.put(None)
    process_consumer.join()

이 코드는 multiprocessing.Queue() 함수를 사용하여 공유 큐 queue를 생성합니다. 그런 다음 각각 producer()consumer() 함수를 호출하는 두 개의 프로세스를 생성합니다. producer() 함수는 0 부터 9 까지의 숫자를 큐에 넣고, consumer() 함수는 큐에서 각 항목을 가져와 콘솔에 출력합니다.

Pool.apply_async() 를 사용한 비동기 작업

map() 외에도 multiprocessing.Pool() 클래스는 apply_async()라는 병렬로 프로세스를 실행하는 또 다른 메서드를 제공합니다. 이 메서드를 사용하면 함수 호출을 프로세스 풀에 제출하고 결과가 나올 때까지 기다리지 않고 즉시 실행을 계속할 수 있습니다. 대신, 콜백 함수를 사용하여 함수 호출의 결과가 준비되었을 때 검색할 수 있습니다.

slow_square.py를 완성하십시오.

import multiprocessing
import time

def slow_square(x):
    time.sleep(1)
    return x * x

def callback(result):
    print(result)

if __name__ == '__main__':
    pool = multiprocessing.Pool(processes=4)
    results = [pool.apply_async(slow_square, (x,), callback=callback) for x in range(10)]
    for result in results:
        result.wait()
    print("All tasks completed.")

이 예제에서는 숫자 x를 받아 1 초 동안 대기한 다음 x의 제곱을 반환하는 함수 slow_square()를 정의합니다. 또한 결과가 준비되면 단순히 결과를 출력하는 콜백 함수 callback()도 정의합니다.

그런 다음 4 개의 프로세스 풀을 생성하고 apply_async()를 사용하여 0 부터 9 까지의 범위에 있는 각 숫자에 대해 풀에 함수 호출을 제출합니다. slow_square() 함수와 인수 xargs 매개변수를 사용하여 전달하고, 결과가 준비되었을 때 호출될 콜백 함수도 지정합니다.

그런 다음 결과 목록을 반복하고 result.wait()를 호출하여 결과가 준비될 때까지 메인 스레드를 차단합니다. 마지막으로 모든 작업이 완료되었음을 나타내는 메시지를 출력합니다.

요약

이 랩에서는 Python multiprocessing 을 사용하여 프로세스를 병렬로 실행하는 방법을 배웠습니다. multiprocessing 이 어떻게 작동하는지 보여주는 간단한 프로그램으로 시작하여, multiprocessing 을 사용하여 처리 속도를 높이고 프로세스 간에 메모리를 공유하며 apply_async()를 사용하여 비동기 작업을 수행하는 더 복잡한 예제로 넘어갔습니다. 이 랩을 마치면 더 큰 처리 능력과 효율성을 달성하고 필요한 경우 프로세스 간에 통신하기 위해 자체 Python 프로그램에서 multiprocessing 을 사용하는 방법에 대한 훌륭한 이해를 갖게 될 것입니다.