Python 다중 처리 로깅
이 기사에서는 다중 처리의 개념에 대해 설명합니다. 그런 다음 Python의 다중 처리와 Python 코드를 사용하여 다중 처리를 위한 로그 처리에 대해 설명합니다.
다중 처리
다중 처리는 둘 이상의 프로세서가 동일한 프로그램의 서로 다른 부분을 동시에 처리하는 컴퓨팅 패러다임입니다.
다중 처리 운영 체제에서 실행되는 응용 프로그램은 성능을 향상시키기 위해 서로 다른 프로세서에 할당하여 독립적으로 실행되는 더 작은 서브루틴으로 나뉩니다.
다중 처리에는 두 가지 유형이 있습니다.
- 대칭 다중 처리: 이 다중 처리 기술에서는 단일 운영 체제가 공유 주 메모리를 사용하여 둘 이상의 컴퓨터 프로세서를 관리합니다. 일반적으로 다중 처리 능력을 가진 컴퓨터 시스템은 대칭적 다중 처리를 지원한다.
- 비대칭 다중 처리: 이 다중 처리에서는 운영 체제 관련 작업을 처리하기 위해 컴퓨터 프로세서가 할당되고 다른 컴퓨터 프로세서는 응용 프로그램 관련 작업이 할당됩니다. 비대칭 다중 처리에서 한 프로세서는 유휴 상태일 수 있고 다른 프로세서는 동일한 시간 간격에서 완전히 바쁠 수 있기 때문에 대칭 다중 처리에 비해 비효율적인 것으로 간주됩니다.
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
메서드를 사용하여 process1
및 process2
가 종료되지 않을 때까지 현재 프로그램을 계속 실행합니다.
process1
및 process2
가 작업을 완료하면 현재 프로그램이 print("Processes Ended")
문을 실행합니다.
위 프로그램의 출력은 다음과 같습니다.
func1: with parameter 1
func2: with parameter 2
Processes Ended
다중 처리 중 Python의 프로세스 ID
두 가지 다른 방법을 사용하여 프로세스 ID(PID
)를 인쇄할 수도 있습니다.
os.getpid()
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
, QueueHandler
및 QueueListener
클래스를 사용할 수 있습니다.
다음 코드를 고려하십시오.
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
개체를 사용하여 두 개의 프로세스를 만들고 인수 값으로 1
및 2
를 사용하여 두 프로세스에서 func
메서드를 호출합니다.
Process_init
메소드는 queue_handler
를 초기화하는 데 사용됩니다. 위 코드의 출력은 다음과 같습니다.
위의 코드는 프로세스 ID가 7024
및 15680
인 두 프로세스에 대한 로그 정보를 보여줍니다.
lg_handler = logging.StreamHandler()
문을 lg_handler = logging.FileHandler('info.log')
로 교체하여 정보를 log
파일에 기록할 수도 있습니다.
logging.FileHandler
는 info.log
파일을 생성하고 info.log
파일에 로그를 저장합니다.