"프로그래밍 언어의 개념과 흐름에 대한 고찰 - 파이썬답게 코딩하기" 학습중...
multiprocessing 기법에 대해 어렴풋이 알거나 몰랐던 내용들 몇가지 정리해봅니다.
## CPython에서는 스레드를 사용할 때 GIL(Global Interpreter Lock)의 영향으로 멀티 코어 환경에서는 제성능을 못낸다.
## 파이썬 공식문서에도 스레드보다는 멀티프로세싱을 권고함.
## 멀티 프로세싱을 하면 CPU 코어 갯수만큼 나눠서 일을 처리. GIL 영향을 안받음.
## 단점으로는 메모리를 많이 차지, 메모리 공유를 위한 IPC 설정(Inter Process Communication)필요.
(예문)
# import os
# import time
# import multiprocessing
#
# def worker(count):
# print("name : %s, argument : %s" % (multiprocessing.current_process().name, count))
# print("parent pid : %s, pid : %s" % (os.getppid(), os.getpid()))
# print("")
#
# def main():
# for i in range(5):
# p = multiprocessing.Process(target = worker, name = "process %i" % i, args = (i,))
# p.start()
# time.sleep(1)
#
# if __name__ == "__main__":
# main()
(실행결과)
# name : process 0, argument : 0
# parent pid : 15076, pid : 15384
#
# name : process 1, argument : 1
# parent pid : 15076, pid : 16480
#
# name : process 2, argument : 2
# parent pid : 15076, pid : 17464
#
# name : process 3, argument : 3
# parent pid : 15076, pid : 17352
#
# name : process 4, argument : 4
# parent pid : 15076, pid : 14260
## 스레드와 비슷한 구현 방법. 부모 프로세스의 id는 15076으로 같으나 process id는 각기 다름.
(예문)
## multiprocess의 클래스 구현
# import os
# import time
# import multiprocessing
#
# class Worker(multiprocessing.Process) :
# def __init__(self, name, args):
# multiprocessing.Process.__init__(self)
# self.name = name
# self.args = args
#
# def run(self):
# print("name : %s, argument : %s" % (self.name, self.args[0]))
# print("parent pid : %s, pid : %s" % (os.getppid(), os.getpid()))
# print("")
#
# def main() :
# for i in range(5) :
# p = Worker(name = "process %i" % i, args = (i,))
# p.start()
# time.sleep(1)
#
# if __name__ == "__main__" :
# main()
(실행결과)
# name : process 0, argument : 0
# parent pid : 18052, pid : 11152
#
# name : process 1, argument : 1
# parent pid : 18052, pid : 7964
#
# name : process 2, argument : 2
# parent pid : 18052, pid : 3316
#
# name : process 3, argument : 3
# parent pid : 18052, pid : 3948
#
# name : process 4, argument : 4
# parent pid : 18052, pid : 14424
## 클래스 만드는 법도 스레드와 동일하다.
## multiprocessing 모듈은 프로세스를 띄우는 방식이기 때문에 띄워진 자식 프로세스에서 메인 모듈을 import 할 수도 있다.
## 그럴 경우 재귀적으로 반복 실행될 수 있으므로 "__main__"을 확인해서 재귀적으로 실행되지 않도록 보호해야 한다.
'파이썬(PYTHON)' 카테고리의 다른 글
파이썬의 멀티프로세스(multiprocessing)3 (0) | 2020.08.30 |
---|---|
파이썬의 멀티프로세스(multiprocessing)2 (0) | 2020.08.29 |
파이썬의 스레드(thread)4 (0) | 2020.08.27 |
파이썬의 스레드(thread)3 (0) | 2020.08.27 |
파이썬의 스레드(thread)2 (0) | 2020.08.25 |