* 이 포스팅은 인프런강의 "동시성과 벙렬성 문법 배우기" 강의를 듣고 공부한 내용의 포스팅임
1. Multithreading
- Difference between Process and Thread
프로세스 : 운영체제에서 할당 받는 자원 단위
cpu동작 시간, 주소 공간(독립적)을 할당받음. 파이프, 파일, 소켓으로 프로세스간 통신 (context switching)
스레드 : 프로세스 내 실행단위. 프로세스 자원 사용. stack만 별도이며 나머지는 공유함.
메모리를 공유하며 한 스레드가 다른스레드에 영향을 끼침 -> 동기화가 필요함
멀티 스레드 : 여러 스레드로 구성 후 처리. 교착상태 발생가능
자원 소모가 감소고 통신 부담도 적어지지만 디버깅이 어려움
멀티 프로세스 : 문제 시 프로세스를 죽임. 캐시 체인지 발생, Cost 비용이 큼(오버헤드 증가). 복잡한 통신방식 - GIL (global Interpretor Lock)
여러 스레드 사용시에도 하나의 스레드만 python object에 접근 가능함 (접근 시 자원에 락이 걸림)
CPython : 바이트파일. 메모리 관리가 취약하므로 Thread-safe를 의도하여 만들어진 개념.
병렬 처리시 멀티 프로세싱 or asyncio 로 구현함
- Thread-Basic
'threading'모듈 import후
thread(target="함수", args="인자") 호출 시 서브 스레드 생성됨
start() : 서브 스레드 작업 시작 (메인 스레드 종룔 상관없이 주어진 일을 끝까지 함)
join() : 자식스레드가 일이 끝나기 전까지 메인 스레드는 기다림. - Daemon, Join
데몬 : 백그라운드에서 작동함. 메인스레드 끝나면 즉시 종료됨
'daemon=True' 옵션으로 생성
isDaemon()으로 확인 가능 - ThreadPoolExecutor
스레드를 생성함. 대기중인 스레드는 큐에 담음.
'concurrent.Futures' 의 ThreadPoolExecutor로 스레드 생성 - Lock, deadlock
세마포어 : 공유된 자원을 한개의 프로세스만 접근처리 하도록 함. 지정된 세마포어 변수 만큼 프로세스 접근가능
뮤텍스 : 공유된 자원을 여러 스레드가 접근하는 것을 막음. 오직 1개의 프로세스만 접근 가능
=> 레이스 컨디션 방지(Lock 사용)
Lock : 상호배제를 위한 잠금처리 기능
deadlock : 교착상태를 뜻함.
threading.lock().acquire() : 락 사용
threading.lock().release() : 락 반환
해당 코드들의 사이에 있는 공유자원에 대한 작업은 동기화됨
with문을 사용하여 자동으로 acquire(), release() 하도록 함. 편리함. - Prod and Cons Using Queue
생산자 소비자 패턴
멀티스레드 디자인 패턴. 중개역할의 디자인
Queue는 중개자 역할로 파이프라인이다.
해당 Queue를 스레드 생성 시 공유되도록 인자로 넣어줌
'Python' 카테고리의 다른 글
[ Python : 동시성과 병렬성 문법 배우기 ] 3. Concurrency CPU Bound, I/O Bound (0) | 2021.08.01 |
---|---|
[ Python : 동시성과 병렬성 문법 배우기 ] 2. Parallelism with Multiprocessing (0) | 2021.08.01 |
[Python 고급] 2. Meta class (0) | 2021.08.01 |
[Python 고급] 1. variable scope, context Manager (0) | 2021.07.31 |
[Python 중급] 2. 파이썬 병행성 (0) | 2021.07.31 |