일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 스탭퍼
- 잡생각
- 월간
- Daily Challenge
- FIT XR
- Writing
- 괜찮음
- 쓰릴오브파이트
- 30분
- 읽기
- 미드시청
- 영어공부
- 사이드
- 10분
- 리얼 클래스
- 매일
- English
- 영어원서읽기
- realclass
- 링피트
- 만화도
- 개발자
- 프로젝트
- 운동
- 3줄정리
- 뭐든
- 파비최
- 화상영어
- leetcode
- Problem Solving
- Today
- Total
파비의 매일매일 공부기록
파이썬 동시성 프로그래밍 - #3 스레드 라이프 본문
이번장에서는 스레드를 통한 작업 수행에 대한 내용을 다룬다.
스레드 상태 : running, not-running, runnable, starting, ended
- 일반적으로 스레드를 생성한다고 자원을 바로 할당받지 않는다. 초기화되었으므로 아무런 상태가 아니며 시작 혹은 정지될 수 있다.
- New Thread : 스레드가 시작되지도, 자원을 할당받지도 않은 상태. 객체 인스턴스만을 나타냄
- Runnable : 스레드 실행 전의 준비 상태. 필요한 모든 자원을 갖고 있으며 작업 스케줄러는 실행에 필요한 스케줄링 준비 중
- Running : 작업 스케줄러에 의해 선택된 작업을 실행. 이후 스레드가 종료되면 데드 상태 또는 비실행 상태로 넘어감
- Not-Running : 스레드가 정지된 상태. 장시간의 입출력 요청 반응에 대기하는 등 여러 이유로 발생. 스레드 실행이 완료될 때까지 일부러 차단되기도 함
- Dead : 여러 이유로 데드 상태가 됨. 자연스럽게 종료되는 경우도 있고 아닌 경우도 있음. 자연스럽게 종료되지 않는 경우 심각한 문제로 이어질 수 있음
여러 형태의 스레드
- POSIX 스레드 : IEEE POSIX 1003.1c 스탠더드에 따라 구현된 스레드. UNIX 시스템 상의 수많은 하드웨어 스레드 구현의 표준을 정하고자 개발됨. PThreads라고도 함.(리눅스에서 몇 번 본 듯..?)
- 윈도 스레드 : 마소에서 자체적으로 로우 레벨 스레드를 구현한 형태. POSIX와는 많은 차이가 있으나 API가 간단하며 전반적으로 가독성 높은 형태를 띠고 있음.
포킹(forking)
- 주어진 프로세스를 모방하는 것을 의미. github에서의 fork와 비슷한 의미인 듯.
- 자체 주소 공간과 함께 부모의 데이터와 프로세스 내의 코드 실행까지 정확하게 복사됨. 그 후, 복제된 프로세스는 자체의 프로세스 식별자(PID)를 받아 복제된 대상인 부모 프로세스와는 독립적으로 작동
- 프로세스를 복제하는 이유 : 각 프로세스가 충돌하고 종료되는 등의 영향 없이, 동시에 실행될 때와 같은 상황에서 새로운 요청에 계속적으로 대응할 수 있기 때문
스레드 데몬화
- 데몬 스레드 : 종료점이 정의되지 않은 '실질적인' 스레드. 프로그램이 종료될 때까지 계속 작동
- 데몬 스레드는 백그라운드에 위치해, 서비스 레지스트리로 주기적으로 변경 없이 갱신 값을 전달. 인스턴스가 종료되는 것을 걱정할 필요 없이 알아서 관리
운영체제에서 스레드를 다루는 방법
- 프로세스 생성과 스레드 생성 : 프로세스는 스레드 보다 복잡한 형태(한 프로세스에서 멀티스레드가 작동하기 때문). 프로세스는 각각의 GIL 인스턴스 형태를 띠므로, 일반적인 스레드보다 CPU 기반 작업을 더 수행할 수 있음.
멀티스레딩 모델
- 한 하드웨어 내 두 종료의 스레드(사용자 스레드와 커널 스레드)가 있음.
- 1개의 사용자 스레드 - 1개의 커널 스레드 매핑 : 커널 스레드의 생성과 유지에 많은 부하가 걸리지만 그 외 사용자 스레드로부터 방해를 받지 않음
- 다수의 사용자 스레드 - 1개의 커널 스레드 매핑 : 사용자 스레드를 효율적으로 사용할 수 있지만, 사용자 스레드가 정지되면 동일한 커널 스레드에 연결된 그 외 스레드도 정지됨
- 다수의 사용자 스레드 - 다수의 커널 스레드 매핑 : 개별적인 사용자 스레드는 단일 및 복수의 커널 스레드 모두와 결합 형태로 매핑 가능. 사용자(개발자)가 특정 사용자 스레드와 커널 스레드의 매핑 결정 가능, 멀티 스레드 환경에서 전반적으로 높은 성능 향상을 보장
- 파이썬 내에서는 일반적으로 1개의 사용자 스레드 - 1개의 커널 스레드 매핑 방식 채택
- asyncio와 같은 멀티스레드와 같은 함수성 프로그래밍 구현 모듈 활용
중간중간 나오는 예제 코드들은 책을 참조하면 좋을 듯.
예제 안에도 이해하는데 도움이 되는 코드 및 설명들이 많음.
'Study > Python' 카테고리의 다른 글
파이썬 동시성 프로그래밍 - #5 스레드 간의 통신 (0) | 2021.08.12 |
---|---|
파이썬 동시성 프로그래밍 - #4 스레드 간 동기화 (0) | 2021.08.11 |
파이썬 동시성 프로그래밍 - #2 병렬화 (0) | 2021.08.09 |
파이썬 동시성 프로그래밍 - #1 시작하기 (2) | 2021.08.08 |
깔끔한 파이썬 탄탄한 백엔드 - #12 더 좋은 백엔드 개발자가 되기 위해.. (0) | 2021.08.07 |