Python 다중 처리 로깅

Dr. Muhammad Abdullah 2024년2월15일
  1. 다중 처리
  2. Python의 다중 처리
  3. Python의 다중 처리 로깅
Python 다중 처리 로깅

이 기사에서는 다중 처리의 개념에 대해 설명합니다. 그런 다음 Python의 다중 처리와 Python 코드를 사용하여 다중 처리를 위한 로그 처리에 대해 설명합니다.

다중 처리

다중 처리는 둘 이상의 프로세서가 동일한 프로그램의 서로 다른 부분을 동시에 처리하는 컴퓨팅 패러다임입니다.

다중 처리 운영 체제에서 실행되는 응용 프로그램은 성능을 향상시키기 위해 서로 다른 프로세서에 할당하여 독립적으로 실행되는 더 작은 서브루틴으로 나뉩니다.

다중 처리에는 두 가지 유형이 있습니다.

  1. 대칭 다중 처리: 이 다중 처리 기술에서는 단일 운영 체제가 공유 주 메모리를 사용하여 둘 이상의 컴퓨터 프로세서를 관리합니다. 일반적으로 다중 처리 능력을 가진 컴퓨터 시스템은 대칭적 다중 처리를 지원한다.
  2. 비대칭 다중 처리: 이 다중 처리에서는 운영 체제 관련 작업을 처리하기 위해 컴퓨터 프로세서가 할당되고 다른 컴퓨터 프로세서는 응용 프로그램 관련 작업이 할당됩니다. 비대칭 다중 처리에서 한 프로세서는 유휴 상태일 수 있고 다른 프로세서는 동일한 시간 간격에서 완전히 바쁠 수 있기 때문에 대칭 다중 처리에 비해 비효율적인 것으로 간주됩니다.

Python의 다중 처리

Python에서 multiprocessing 라이브러리는 다중 처리 작업에 사용됩니다.

다음 예를 고려하십시오.

import multiprocessing


def func1(arg):
    print("func1: with parameter", arg)


def func2(arg):
    print("func2: with parameter", arg)


if __name__ == "__main__":
    process1 = multiprocessing.Process(target=func1, args=(1,))
    process2 = multiprocessing.Process(target=func2, args=(2,))

    process1.start()
    process2.start()

    process1.join()
    process2.join()
    print("Processes Ended")

위의 코드에서 import multiprocessing을 사용하여 multiprocessing 모듈을 포함합니다. Process 클래스 개체는 프로세스를 생성하는 데 사용됩니다.

Process 클래스 객체는 target(프로세스에서 실행할 함수)을 매개변수로 받고 target 함수의 인수로 args를 받습니다.

Process 클래스의 start 메소드는 프로세스를 시작하는 데 사용됩니다. 위의 예에서는 두 개의 프로세스를 시작했습니다.

join 메서드를 사용하여 process1process2가 종료되지 않을 때까지 현재 프로그램을 계속 실행합니다.

process1process2가 작업을 완료하면 현재 프로그램이 print("Processes Ended") 문을 실행합니다.

위 프로그램의 출력은 다음과 같습니다.

func1: with parameter 1
func2: with parameter 2
Processes Ended

다중 처리 중 Python의 프로세스 ID

두 가지 다른 방법을 사용하여 프로세스 ID(PID)를 인쇄할 수도 있습니다.

  1. os.getpid()
  2. Process 클래스 개체 멤버 변수 pid

다음 코드를 고려하십시오.

import multiprocessing
import os


def func1(arg):
    print("func1: with parameter ", arg)
    print("ID of func1 process:", os.getpid())


def func2(arg):
    print("func2: with parameter ", arg)
    print("ID of func2 process:", os.getpid())


if __name__ == "__main__":
    process1 = multiprocessing.Process(target=func1, args=(1,))
    process2 = multiprocessing.Process(target=func2, args=(2,))

    process1.start()
    process2.start()

    print("Process 1 / function 1 PID: ", process1.pid)
    print("Process 2 / function 2 PID: ", process2.pid)
    process1.join()
    process2.join()
    print("Processes Ended")

위의 예에서 os.getpid()process1.pid는 프로세스 ID를 보여줍니다. 다음 코드의 출력은 다음과 같습니다.

Process 1 / function 1 PID:  11368
Process 2 / function 2 PID:  14876
func1: with parameter  1
ID of func1 process: 11368
func2: with parameter  2
ID of func2 process: 14876
Processes Ended

os.getpid()process1.pid는 동일한 프로세스 ID를 보여줍니다.

클래스를 사용한 다중 처리

Python multiprocessing 모듈의 Pool 클래스는 다른 입력 값으로 동일한 함수를 병렬로 실행하는 데 사용됩니다. 예를 들어 다음 코드를 고려하십시오.

import multiprocessing


def func1(arg):
    print("func1: with parameter ", arg)


if __name__ == "__main__":
    process_pool = multiprocessing.Pool(3)
    process_pool.map(func1, [1, 2, 3])
    process_pool.close()
    process_pool.join()

위의 코드에서 multiprocessing.Pool은 다른 인수로 func1을 호출하는 세 개의 프로세스를 만듭니다. 다음 코드의 출력은 다음과 같습니다.

func1: with parameter  1
func1: with parameter  2
func1: with parameter  3

Python의 다중 처리 로깅

Python의 multiprocessing 라이브러리를 사용하여 여러 프로세스의 정보를 기록할 수 있습니다. 다중 처리를 로깅하는 방법에는 여러 가지가 있습니다.

로깅을 위해 Python에서 logging.handlers, QueueHandlerQueueListener 클래스를 사용할 수 있습니다.

다음 코드를 고려하십시오.

import multiprocessing
import logging
import os
from logging.handlers import QueueHandler, QueueListener


def func(arg):
    logging.info(
        "Process/function with argument {} and PID {}".format(arg, os.getpid())
    )


def Process_init(q):
    queue_handler = QueueHandler(q)
    logger = logging.getLogger()
    logger.setLevel(logging.DEBUG)
    logger.addHandler(queue_handler)


if __name__ == "__main__":
    print("Main Started")
    mp_queue = multiprocessing.Queue()
    lg_handler = logging.StreamHandler()

    lg_handler.setFormatter(
        logging.Formatter("%(levelname)s: %(asctime)s - %(process)s - %(message)s")
    )

    queue_listener = QueueListener(mp_queue, lg_handler)
    queue_listener.start()

    process_pool = multiprocessing.Pool(2, Process_init, [mp_queue])
    process_pool.map(func, [1, 2])
    process_pool.close()
    process_pool.join()

    queue_listener.stop()
    print("Main Ended")

위의 코드는 하나의 인수를 받는 func 함수를 정의합니다.

func 메소드는 인수 값과 프로세스 ID가 있는 문자열을 기록합니다. os.getpid()를 사용하여 프로세스 ID를 얻습니다.

main 메서드에서 QueueListener에 대한 multiprocessing.Queue()logging.StreamHandler() 객체를 생성합니다. handler.setFormatter는 로그 형식을 설정하는 데 사용됩니다.

multiprocessing.Pool 개체를 사용하여 두 개의 프로세스를 만들고 인수 값으로 12를 사용하여 두 프로세스에서 func 메서드를 호출합니다.

Process_init 메소드는 queue_handler를 초기화하는 데 사용됩니다. 위 코드의 출력은 다음과 같습니다.

다중 처리 로깅에 대한 출력

위의 코드는 프로세스 ID가 702415680인 두 프로세스에 대한 로그 정보를 보여줍니다.

lg_handler = logging.StreamHandler() 문을 lg_handler = logging.FileHandler('info.log')로 교체하여 정보를 log 파일에 기록할 수도 있습니다.

logging.FileHandlerinfo.log 파일을 생성하고 info.log 파일에 로그를 저장합니다.

관련 문장 - Python Multiprocessing