SlideShare a Scribd company logo
1 of 54
More Effective Python 3st
2017년 10월 17일
WAPPLES개발부 | 심경섭
Multitasking
I. Background
II. Thread
III. Coroutine
IV. QnA
목차
Background
• I/O Bound
• 작업 시간이 주로 입/출력 작업이 완료될 때까지 대기하는 기간에 의해
결정되는 것들을 말함
• CPU Bound
• 작업 시간이 주로 중앙 Processor 의 처리 시간에 영향을 받아 결정되는
것들을 말함
I/O Bound vs CPU Bound
4
• 동시성 (Concurrency)
• 서로 독립적인 작업을 작은 단위 연산으로 나누고 시분할 형태로 연산
• 논리적으로 동시에 실행되는 것 처럼 보여짐
• 단일 Thread/Processor 에서도 적용 가능
• 병렬성 (Parallelism)
• 실제로 동시에 여러 작업을 연산
• 단일 Thread/Processor 에서는 적용 불가 (대조적으로)
• 데이터 병렬성과 작업 병렬성으로 구분 할 수 있음
Concurrency VS Parallelism
5
• 작업 병렬성
• 동시에 구분된 작업을 수행
• 독립적인 작업을 여러 쓰레드에 나눠서 연산
• 데이터 병렬성
• 동시에 같은 연산을 서로 다른 데이터에 대해 수행
• 같은 연산을 다른 스레드에서 수행
Task Parallelism VS Data Parallelism
6
• 동시성
• 작업 병렬성
• 데이터 병렬성
Concurrency VS Task Parallelism VS Data Parallelism
7
1 1 2 2 3 3 4 4
1
1
2
2
3
3
4
4
1 33 1
2 24 4
• 동시에 하나 이상의 작업이나 프로그램을 처리할 수 있는 능력
• Single-Tasking 이랑 반대되는 용어
• 하나의 작업이 완전히 끝나야만 다른 작업을 시작할 수 있음
• Processor 의 갯수보다 동시에 많은 일을 할 수 있도록 함
Multi-Tasking
8
• Preemptive Multitasking (선점형 멀티태스킹)
• 작업의 선점이 허락되는 멀티태스킹 방법
• 인터럽트 메커니즘을 포함하여, 스케줄러가 현재 실행중인 작업을
중단하고 다른 작업을 결정할 수도 있음
• Cooperative Multitasking (협력형 멀티태스킹)
• Non- Preemptive 라고도 불림
• 프로세서가 정기적으로, 혹은 유후 상태일때 자발적으로 현재 실행
중인 작업의 제어권을 넘김
Multi-Tasking
9
Multi-Tasking
10
• SMP (Symmetric Multiprocessing)
• 모든 Processor 들이 동등한 권리를 가짐
• 모두 같은 물리적인 메모리에 접근할 수 있음
• ASMP (Asymmetric Multiprocessing)
• Processor 마다 다른 권리를 가짐
• Processor 마다 다른 물리적인 메모리 공간을 가질 수 있음
• 특정 Process 는 특정 Processor 에서만 실행됨
SMP vs ASMP
11
SMP vs ASMP
12
Thread
• Process 내에서 독립적으로 실행될 수 있는 명령들의 묶음
• 대부분의 경우, Thread 는 Process의 하위로 구성됨
Thread
14
• Process 들은 서로 독립적으로 존재
• Thread 들은 Process 의 집합으로 존재
• Process 들은 분리된 주소 공간을 가짐
• Thread 들은 주소 공간을 공유함
• Process 들 간의 통신에는 시스템이 제공하는 IPC 에 의하여 가능
• Thread 들은 Process 의 상태와 메모리, 다른 자원을 공유
Thread vs Process
15
• Input 에 대한 빠른 대응을 할 수 있음
• 동시에 작업 할 수 있기 때문에 빠름
• 프로세스를 여러개 생성하는 것보다 자원 소모가 적음
• 자원 공유와 소통이 프로세스 보다 간단함
Thread 강점
16
• 동기화 문제가 있음
• 하나의 스레드가 프로세스를 중단시킬 수 있음
Thread 약점
17
• Python 에서 Thread 는 동시에 여러 작업을 수행하는 것 처럼 보여짐
• CPython 기준으로 Thread 에서 GIL 을 사용
Thread in Python
18
• Python 에서 사용하는 Global Lock
• Lock 은 크게 두 종류의 개념으로 분리
• Coarse-Grained-Lock : 큰 단위로 Lock 을 잡아 사용
• Fine-Grained-Lock : 작은 단위로 Lock 을 잡아 사용
• GIL 은 Coarse-Grained-Lock
GIL (Global Interpreter Lock)
19
• Single Thread 일때, 속도가 빠름
• C Extension/Wrapping 이 유용
• C Extension 사용시, GIL 이 해제됨
• C Library 사용시, GIL 을 사용하면 Thread-Safety 를 고려할 필요 없음
• I/O Bound 에 유리
• Blocking I/O Call 의 경우, GIL 의 영향이 없음
Coarse-Grained-Lock
20
Thread in CPython
21
Thread in CPython
22
• https://docs.python.org/3.6/library/threading.html
Thread in CPython
23
• 자원을 효율적으로 사용하려면 Multiprocess 를 사용하는 것을 권장
• ProcessPoolExecutor 는 Python 3.x 부터 추가됨
• 여러 I/O-Bound 작업을 동시에 수행하는 것에는 문제 되지 않음
Thread in CPython
24
• 스레드 기반 시스템 구현을 지원하는 두 가지 모듈이 있음
• _thread
• 저수준 API 지원
• 커스터마이징한 Thread Pool 이나 Lock 다른 원시적인 기능을 사용할 때 유용
• threading (thread 에서 rename 되었음)
• 고수준 API 지원
• 일반적으로 많이 사용
Thread in Python
25
Thread in Python
26
Thread in Python
27
Thread in Python
28
Thread in Python
29
Thread in Python
30
Thread in Python
31
• 장점
• 메모리 사용량이 적음
• 공유된 메모리를 사용하여 프로세스의 상태를 공유할 수 있음
• I/O Bound 작업에 좋은 선택지가 됨
• 단점
• GIL 의 영향을 받음
• interruptible 하고 killable 할 수 없음
• 일반적으로 코드의 직관성이 떨어짐
Threading
32
• 장점
• 분리된 메모리 공간을 가지고 있고, CPU와 코어 갯수의 장점을 살릴 수 있음
• CPython 에서 GIL 의 영향을 받지 않음
• CPython 에서 CPU-Bound 작업은 Multiprocessing 으로 처리해야함
• Shared Memory 를 사용하지 않는 한, 대부분의 동기화 문제가 사라짐
• 자식 프로세스들을 interruptible 하고 killable 할 수 있음
• 단점
• IPC 사용이 복잡할 수 있음
• 메모리를 보다 많이 사용할 수 있음
Multiprocessing
33
Multiprocessing in Python
34
Multiprocessing in Python
35
Coroutine
• 비선점 멀티태스킹을 위해 만들어진 서브루틴
• 실행의 정지와 재개를 위한 여러 진입점을 허락
• Exception, Event loops, Iterators, Infinite list, Pipe 등에 적합
Coroutine
37
• Subroutine
• 처음부터 시작하여, 끝날때 한번 종료됨
• Subroutine 의 Instance 는 한번만 반환함
• 호출간의 상태를 유지하고 있지 않음
• 프로그램 시작전에 할당된 하나의 스택만 있으면 됨
• Coroutine
• 다른 Coroutine 을 호출하며, 종료될 수 있고, 원래 로직으로 돌아올 수 있음
• 상태를 유지하며, 호출마다 다름
• 사전에 할당된 스택이나 이전에 할당된 스택을 캐싱하여 저비용으로 만들 수 있음
Subroutine 과의 비교
38
• Generator
• Semi-Coroutine 이라고도 불림
• 제어권을 여러번 양보할 수 있음
• 실행 중인 작업을 중단하고, 여러 진입점에서 재 진입 할 수 있음
• 제어권을 양보한 뒤에도 실행의 흐름을 제어 할 수 없음
• 컨트롤을 Generator 의 호출자에게 넘김
• Yield 는 반환의 목적
• Coroutine
• 제어권을 여러번 양보할 수 있음
• 실행 중인 작업을 중단하고, 여러 진입점에서 재 진입 할 수 있음
• 제어권을 양보한 뒤에도 실행의 흐름을 제어 할 수 있음
• Yield 는 입력의 목적
Generator 와의 비교
39
Coroutine in Python (Generator base)
40
Coroutine in Python (Generator base)
41
Coroutine in Python (Generator base)
42
Coroutine in Python (yield from)
43
• yield from
• Python 3.3 버전에서 추가됨
Concurrent.futures (비동기 Non-blocking)
44
• 멀티프로세싱 및 멀티스레딩을 위한 API 제공
• 다중 스레드와 다중 프로세스에 타겟팅
• Python 3.2 에 추가됨
• 기존에는 스레드, 프로세스 관련 API들이 C 코드의 래핑 수준이었음
• 스레드와 프로세스를 사용하는 API 를 통일
Asyncio (단일 스레드 비동기 Non-Blocking 지원)
45
• 비동기 Non-Blocking I/O
• I/O 작업에서 불필요하게 기다리는 시간을 비동기로 처리하여
Block 되지 않도록 하는 개념
• NodeJS 에서도 단일 스레드 비동기 I/O 개념을 사용하여 불필
요한 대기 시간을 줄이는 것으로 성능을 향상
Coroutine in Python (asyncio)
46
• asyncio
• Python 3.4 버전에서 추가됨
• 비동기 프로그래밍을 위한 모듈
Coroutine in Python (Native Coroutine)
47
Coroutine in Python (Native Coroutine)
48
• asyncio
• Python 3.5 버전에서 추가됨
• async 와 await 가 추가됨
• async 는 native coroutine 선언
• await 는 yield 를 대체하는 표현
• 해당 작업이 끝날때까지 대기한다는 의미
• Native Coroutine 과 Generator 기반의 Coroutine 은 혼용해서 사용할 수 없음
• asnyc / await 구문과 yield 를 혼용해서 사용할 수 없음
• Native Coroutine 과 Generator 기반의 Coroutine 은 상호 운영 가능
Coroutine in Python (Native Coroutine)
49
Coroutine in Python (asyncio)
50
Else
51
• Gevent
• Libev 기반의 동시성 라이브러리
• 동시성과 네트워크 관련 작업들을 위한 API 제공
• Green Thread를 사용
• Greenlets
• Gevent 에서 주로 사용되는 패턴
• C 확장 모듈 형태로 제공되는 경량 코루틴
Else
52
• Green Thread
• Runtime Library 나 Virtual Machine 에 의해 스케줄링 되는 스레드
• OS 기반으로 스케줄링 되지 않음
• 커널 공간이 아닌 유저 영역에서 관리됨
• Java 의 Thread library 에서 유래함
• CPU 문맥 교환 문제를 제외하고는 일반 스레드가 가진 문제와 동일
QnA
t h a n k y o u
Copyright 2017 Penta Security Systems Inc. All rights reserved.
KOREA
U.S.A.
JAPAN
Yeouido, Seoul www.pentasecurity.co.kr (HQ)
Houston, Texas www.pentasecurity.com
Shinjuku-Ku, Tokyo www.pentasecurity.co.jp

More Related Content

What's hot

Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)내훈 정
 
Windows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCPWindows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCPSeungmo Koo
 
파이콘 한국 2019 - 파이썬으로 서버를 극한까지 끌어다 쓰기: Async I/O의 밑바닥
파이콘 한국 2019 - 파이썬으로 서버를 극한까지 끌어다 쓰기: Async I/O의 밑바닥파이콘 한국 2019 - 파이썬으로 서버를 극한까지 끌어다 쓰기: Async I/O의 밑바닥
파이콘 한국 2019 - 파이썬으로 서버를 극한까지 끌어다 쓰기: Async I/O의 밑바닥Seomgi Han
 
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화게임서버프로그래밍 #7 - 패킷핸들링 및 암호화
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화Seungmo Koo
 
Tcp ip & io model
Tcp ip & io modelTcp ip & io model
Tcp ip & io modelNam Hyeonuk
 
Python으로 채팅 구현하기
Python으로 채팅 구현하기Python으로 채팅 구현하기
Python으로 채팅 구현하기Tae Young Lee
 
병렬 프로그래밍 패러다임
병렬 프로그래밍 패러다임병렬 프로그래밍 패러다임
병렬 프로그래밍 패러다임codenavy
 
[OpenStack 하반기 스터디] Auto Install Kilo
[OpenStack 하반기 스터디] Auto Install Kilo[OpenStack 하반기 스터디] Auto Install Kilo
[OpenStack 하반기 스터디] Auto Install KiloOpenStack Korea Community
 
Microsoft pp lpdf
Microsoft pp lpdfMicrosoft pp lpdf
Microsoft pp lpdfHYUNWOO KIM
 
게임서버프로그래밍 #2 - IOCP Adv
게임서버프로그래밍 #2 - IOCP Adv게임서버프로그래밍 #2 - IOCP Adv
게임서버프로그래밍 #2 - IOCP AdvSeungmo Koo
 
NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기
NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기
NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기Jinuk Kim
 
게임서버프로그래밍 #4 - 멀티스레드 프로그래밍
게임서버프로그래밍 #4 - 멀티스레드 프로그래밍게임서버프로그래밍 #4 - 멀티스레드 프로그래밍
게임서버프로그래밍 #4 - 멀티스레드 프로그래밍Seungmo Koo
 
portfolio-subtitle-convert-김남운
portfolio-subtitle-convert-김남운portfolio-subtitle-convert-김남운
portfolio-subtitle-convert-김남운Namwun Kim
 
Asynchronous agents library(aal)pdf
Asynchronous agents library(aal)pdfAsynchronous agents library(aal)pdf
Asynchronous agents library(aal)pdfHYUNWOO KIM
 
게임서버프로그래밍 #6 - 예외처리 및 로깅
게임서버프로그래밍 #6 - 예외처리 및 로깅게임서버프로그래밍 #6 - 예외처리 및 로깅
게임서버프로그래밍 #6 - 예외처리 및 로깅Seungmo Koo
 
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델Seungmo Koo
 
Stash 사용자 교육
Stash 사용자 교육Stash 사용자 교육
Stash 사용자 교육Byeongsu Kang
 
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기Chanwoong Kim
 

What's hot (20)

Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
 
Windows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCPWindows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCP
 
파이콘 한국 2019 - 파이썬으로 서버를 극한까지 끌어다 쓰기: Async I/O의 밑바닥
파이콘 한국 2019 - 파이썬으로 서버를 극한까지 끌어다 쓰기: Async I/O의 밑바닥파이콘 한국 2019 - 파이썬으로 서버를 극한까지 끌어다 쓰기: Async I/O의 밑바닥
파이콘 한국 2019 - 파이썬으로 서버를 극한까지 끌어다 쓰기: Async I/O의 밑바닥
 
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화게임서버프로그래밍 #7 - 패킷핸들링 및 암호화
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화
 
Tcp ip & io model
Tcp ip & io modelTcp ip & io model
Tcp ip & io model
 
Python으로 채팅 구현하기
Python으로 채팅 구현하기Python으로 채팅 구현하기
Python으로 채팅 구현하기
 
병렬 프로그래밍 패러다임
병렬 프로그래밍 패러다임병렬 프로그래밍 패러다임
병렬 프로그래밍 패러다임
 
[OpenStack 하반기 스터디] Auto Install Kilo
[OpenStack 하반기 스터디] Auto Install Kilo[OpenStack 하반기 스터디] Auto Install Kilo
[OpenStack 하반기 스터디] Auto Install Kilo
 
Microsoft pp lpdf
Microsoft pp lpdfMicrosoft pp lpdf
Microsoft pp lpdf
 
게임서버프로그래밍 #2 - IOCP Adv
게임서버프로그래밍 #2 - IOCP Adv게임서버프로그래밍 #2 - IOCP Adv
게임서버프로그래밍 #2 - IOCP Adv
 
NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기
NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기
NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기
 
게임서버프로그래밍 #4 - 멀티스레드 프로그래밍
게임서버프로그래밍 #4 - 멀티스레드 프로그래밍게임서버프로그래밍 #4 - 멀티스레드 프로그래밍
게임서버프로그래밍 #4 - 멀티스레드 프로그래밍
 
portfolio-subtitle-convert-김남운
portfolio-subtitle-convert-김남운portfolio-subtitle-convert-김남운
portfolio-subtitle-convert-김남운
 
pyOpenCL 입문
pyOpenCL 입문pyOpenCL 입문
pyOpenCL 입문
 
Asynchronous agents library(aal)pdf
Asynchronous agents library(aal)pdfAsynchronous agents library(aal)pdf
Asynchronous agents library(aal)pdf
 
게임서버프로그래밍 #6 - 예외처리 및 로깅
게임서버프로그래밍 #6 - 예외처리 및 로깅게임서버프로그래밍 #6 - 예외처리 및 로깅
게임서버프로그래밍 #6 - 예외처리 및 로깅
 
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
 
TBB 소개
TBB 소개TBB 소개
TBB 소개
 
Stash 사용자 교육
Stash 사용자 교육Stash 사용자 교육
Stash 사용자 교육
 
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
 

Similar to More Effective Python 3st (Multitask)

Windows via C/C++ 06 스레드의 기본
Windows via C/C++ 06 스레드의 기본Windows via C/C++ 06 스레드의 기본
Windows via C/C++ 06 스레드의 기본ssuser0c2478
 
Concurreny programming
Concurreny programmingConcurreny programming
Concurreny programmingJaejin Yun
 
서버 아키텍처 이해를 위한 프로세스와 쓰레드
서버 아키텍처 이해를 위한 프로세스와 쓰레드서버 아키텍처 이해를 위한 프로세스와 쓰레드
서버 아키텍처 이해를 위한 프로세스와 쓰레드KwangSeob Jeong
 
운영체제 Sig4
운영체제 Sig4운영체제 Sig4
운영체제 Sig4Jiwan Yoon
 
뇌자T etc.windows multi threading programming
뇌자T   etc.windows multi threading programming뇌자T   etc.windows multi threading programming
뇌자T etc.windows multi threading programmingcancan21st
 
Linux reversing study_basic_4
Linux reversing study_basic_4Linux reversing study_basic_4
Linux reversing study_basic_4Jinkyoung Kim
 
AngularJS In Production
AngularJS In ProductionAngularJS In Production
AngularJS In ProductionMooYeol Lee
 
파이썬 병렬프로그래밍
파이썬 병렬프로그래밍파이썬 병렬프로그래밍
파이썬 병렬프로그래밍Yong Joon Moon
 
운영 체제 Sig
운영 체제 Sig운영 체제 Sig
운영 체제 SigYoungGun Na
 
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발Jeongkyu Shin
 
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018devCAT Studio, NEXON
 
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)Dong Chan Shin
 
Kubernetes in action
Kubernetes in actionKubernetes in action
Kubernetes in actionBingu Shim
 
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화sung ki choi
 
쓰레드.pdf
쓰레드.pdf쓰레드.pdf
쓰레드.pdfSeokju Hong
 
[2D4]Python에서의 동시성_병렬성
[2D4]Python에서의 동시성_병렬성[2D4]Python에서의 동시성_병렬성
[2D4]Python에서의 동시성_병렬성NAVER D2
 
18 2 파이썬표준라이브러리
18 2 파이썬표준라이브러리18 2 파이썬표준라이브러리
18 2 파이썬표준라이브러리Changwon National University
 

Similar to More Effective Python 3st (Multitask) (20)

Windows via C/C++ 06 스레드의 기본
Windows via C/C++ 06 스레드의 기본Windows via C/C++ 06 스레드의 기본
Windows via C/C++ 06 스레드의 기본
 
Concurreny programming
Concurreny programmingConcurreny programming
Concurreny programming
 
서버 아키텍처 이해를 위한 프로세스와 쓰레드
서버 아키텍처 이해를 위한 프로세스와 쓰레드서버 아키텍처 이해를 위한 프로세스와 쓰레드
서버 아키텍처 이해를 위한 프로세스와 쓰레드
 
운영체제 Sig4
운영체제 Sig4운영체제 Sig4
운영체제 Sig4
 
뇌자T etc.windows multi threading programming
뇌자T   etc.windows multi threading programming뇌자T   etc.windows multi threading programming
뇌자T etc.windows multi threading programming
 
Linux reversing study_basic_4
Linux reversing study_basic_4Linux reversing study_basic_4
Linux reversing study_basic_4
 
AngularJS In Production
AngularJS In ProductionAngularJS In Production
AngularJS In Production
 
파이썬 병렬프로그래밍
파이썬 병렬프로그래밍파이썬 병렬프로그래밍
파이썬 병렬프로그래밍
 
System+os study 3
System+os study 3System+os study 3
System+os study 3
 
운영 체제 Sig
운영 체제 Sig운영 체제 Sig
운영 체제 Sig
 
TurboRepo
TurboRepoTurboRepo
TurboRepo
 
Kubernetes
Kubernetes Kubernetes
Kubernetes
 
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
 
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
 
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
 
Kubernetes in action
Kubernetes in actionKubernetes in action
Kubernetes in action
 
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
 
쓰레드.pdf
쓰레드.pdf쓰레드.pdf
쓰레드.pdf
 
[2D4]Python에서의 동시성_병렬성
[2D4]Python에서의 동시성_병렬성[2D4]Python에서의 동시성_병렬성
[2D4]Python에서의 동시성_병렬성
 
18 2 파이썬표준라이브러리
18 2 파이썬표준라이브러리18 2 파이썬표준라이브러리
18 2 파이썬표준라이브러리
 

More from 경섭 심

Python Packaging & Debian Packaging
Python Packaging & Debian PackagingPython Packaging & Debian Packaging
Python Packaging & Debian Packaging경섭 심
 
Debian packaging - Advanced
Debian packaging - AdvancedDebian packaging - Advanced
Debian packaging - Advanced경섭 심
 
Debian packaging - basic process
Debian packaging - basic processDebian packaging - basic process
Debian packaging - basic process경섭 심
 
Ubuntu packaging - deploy package
Ubuntu packaging - deploy packageUbuntu packaging - deploy package
Ubuntu packaging - deploy package경섭 심
 
Ubuntu packaging - make package
Ubuntu packaging - make packageUbuntu packaging - make package
Ubuntu packaging - make package경섭 심
 
Main Variable Program
Main Variable ProgramMain Variable Program
Main Variable Program경섭 심
 
Python comparing
Python comparingPython comparing
Python comparing경섭 심
 
Python coroutine
Python coroutinePython coroutine
Python coroutine경섭 심
 
Debian 패키지 관리 프로세스
Debian 패키지 관리 프로세스Debian 패키지 관리 프로세스
Debian 패키지 관리 프로세스경섭 심
 
Effective Python 2st (Decorator & Generator)
Effective Python 2st (Decorator & Generator)Effective Python 2st (Decorator & Generator)
Effective Python 2st (Decorator & Generator)경섭 심
 
Effective Python 1st (Test & Style)
Effective Python 1st (Test & Style)Effective Python 1st (Test & Style)
Effective Python 1st (Test & Style)경섭 심
 

More from 경섭 심 (11)

Python Packaging & Debian Packaging
Python Packaging & Debian PackagingPython Packaging & Debian Packaging
Python Packaging & Debian Packaging
 
Debian packaging - Advanced
Debian packaging - AdvancedDebian packaging - Advanced
Debian packaging - Advanced
 
Debian packaging - basic process
Debian packaging - basic processDebian packaging - basic process
Debian packaging - basic process
 
Ubuntu packaging - deploy package
Ubuntu packaging - deploy packageUbuntu packaging - deploy package
Ubuntu packaging - deploy package
 
Ubuntu packaging - make package
Ubuntu packaging - make packageUbuntu packaging - make package
Ubuntu packaging - make package
 
Main Variable Program
Main Variable ProgramMain Variable Program
Main Variable Program
 
Python comparing
Python comparingPython comparing
Python comparing
 
Python coroutine
Python coroutinePython coroutine
Python coroutine
 
Debian 패키지 관리 프로세스
Debian 패키지 관리 프로세스Debian 패키지 관리 프로세스
Debian 패키지 관리 프로세스
 
Effective Python 2st (Decorator & Generator)
Effective Python 2st (Decorator & Generator)Effective Python 2st (Decorator & Generator)
Effective Python 2st (Decorator & Generator)
 
Effective Python 1st (Test & Style)
Effective Python 1st (Test & Style)Effective Python 1st (Test & Style)
Effective Python 1st (Test & Style)
 

More Effective Python 3st (Multitask)

  • 1. More Effective Python 3st 2017년 10월 17일 WAPPLES개발부 | 심경섭 Multitasking
  • 2. I. Background II. Thread III. Coroutine IV. QnA 목차
  • 4. • I/O Bound • 작업 시간이 주로 입/출력 작업이 완료될 때까지 대기하는 기간에 의해 결정되는 것들을 말함 • CPU Bound • 작업 시간이 주로 중앙 Processor 의 처리 시간에 영향을 받아 결정되는 것들을 말함 I/O Bound vs CPU Bound 4
  • 5. • 동시성 (Concurrency) • 서로 독립적인 작업을 작은 단위 연산으로 나누고 시분할 형태로 연산 • 논리적으로 동시에 실행되는 것 처럼 보여짐 • 단일 Thread/Processor 에서도 적용 가능 • 병렬성 (Parallelism) • 실제로 동시에 여러 작업을 연산 • 단일 Thread/Processor 에서는 적용 불가 (대조적으로) • 데이터 병렬성과 작업 병렬성으로 구분 할 수 있음 Concurrency VS Parallelism 5
  • 6. • 작업 병렬성 • 동시에 구분된 작업을 수행 • 독립적인 작업을 여러 쓰레드에 나눠서 연산 • 데이터 병렬성 • 동시에 같은 연산을 서로 다른 데이터에 대해 수행 • 같은 연산을 다른 스레드에서 수행 Task Parallelism VS Data Parallelism 6
  • 7. • 동시성 • 작업 병렬성 • 데이터 병렬성 Concurrency VS Task Parallelism VS Data Parallelism 7 1 1 2 2 3 3 4 4 1 1 2 2 3 3 4 4 1 33 1 2 24 4
  • 8. • 동시에 하나 이상의 작업이나 프로그램을 처리할 수 있는 능력 • Single-Tasking 이랑 반대되는 용어 • 하나의 작업이 완전히 끝나야만 다른 작업을 시작할 수 있음 • Processor 의 갯수보다 동시에 많은 일을 할 수 있도록 함 Multi-Tasking 8
  • 9. • Preemptive Multitasking (선점형 멀티태스킹) • 작업의 선점이 허락되는 멀티태스킹 방법 • 인터럽트 메커니즘을 포함하여, 스케줄러가 현재 실행중인 작업을 중단하고 다른 작업을 결정할 수도 있음 • Cooperative Multitasking (협력형 멀티태스킹) • Non- Preemptive 라고도 불림 • 프로세서가 정기적으로, 혹은 유후 상태일때 자발적으로 현재 실행 중인 작업의 제어권을 넘김 Multi-Tasking 9
  • 11. • SMP (Symmetric Multiprocessing) • 모든 Processor 들이 동등한 권리를 가짐 • 모두 같은 물리적인 메모리에 접근할 수 있음 • ASMP (Asymmetric Multiprocessing) • Processor 마다 다른 권리를 가짐 • Processor 마다 다른 물리적인 메모리 공간을 가질 수 있음 • 특정 Process 는 특정 Processor 에서만 실행됨 SMP vs ASMP 11
  • 14. • Process 내에서 독립적으로 실행될 수 있는 명령들의 묶음 • 대부분의 경우, Thread 는 Process의 하위로 구성됨 Thread 14
  • 15. • Process 들은 서로 독립적으로 존재 • Thread 들은 Process 의 집합으로 존재 • Process 들은 분리된 주소 공간을 가짐 • Thread 들은 주소 공간을 공유함 • Process 들 간의 통신에는 시스템이 제공하는 IPC 에 의하여 가능 • Thread 들은 Process 의 상태와 메모리, 다른 자원을 공유 Thread vs Process 15
  • 16. • Input 에 대한 빠른 대응을 할 수 있음 • 동시에 작업 할 수 있기 때문에 빠름 • 프로세스를 여러개 생성하는 것보다 자원 소모가 적음 • 자원 공유와 소통이 프로세스 보다 간단함 Thread 강점 16
  • 17. • 동기화 문제가 있음 • 하나의 스레드가 프로세스를 중단시킬 수 있음 Thread 약점 17
  • 18. • Python 에서 Thread 는 동시에 여러 작업을 수행하는 것 처럼 보여짐 • CPython 기준으로 Thread 에서 GIL 을 사용 Thread in Python 18
  • 19. • Python 에서 사용하는 Global Lock • Lock 은 크게 두 종류의 개념으로 분리 • Coarse-Grained-Lock : 큰 단위로 Lock 을 잡아 사용 • Fine-Grained-Lock : 작은 단위로 Lock 을 잡아 사용 • GIL 은 Coarse-Grained-Lock GIL (Global Interpreter Lock) 19
  • 20. • Single Thread 일때, 속도가 빠름 • C Extension/Wrapping 이 유용 • C Extension 사용시, GIL 이 해제됨 • C Library 사용시, GIL 을 사용하면 Thread-Safety 를 고려할 필요 없음 • I/O Bound 에 유리 • Blocking I/O Call 의 경우, GIL 의 영향이 없음 Coarse-Grained-Lock 20
  • 24. • 자원을 효율적으로 사용하려면 Multiprocess 를 사용하는 것을 권장 • ProcessPoolExecutor 는 Python 3.x 부터 추가됨 • 여러 I/O-Bound 작업을 동시에 수행하는 것에는 문제 되지 않음 Thread in CPython 24
  • 25. • 스레드 기반 시스템 구현을 지원하는 두 가지 모듈이 있음 • _thread • 저수준 API 지원 • 커스터마이징한 Thread Pool 이나 Lock 다른 원시적인 기능을 사용할 때 유용 • threading (thread 에서 rename 되었음) • 고수준 API 지원 • 일반적으로 많이 사용 Thread in Python 25
  • 32. • 장점 • 메모리 사용량이 적음 • 공유된 메모리를 사용하여 프로세스의 상태를 공유할 수 있음 • I/O Bound 작업에 좋은 선택지가 됨 • 단점 • GIL 의 영향을 받음 • interruptible 하고 killable 할 수 없음 • 일반적으로 코드의 직관성이 떨어짐 Threading 32
  • 33. • 장점 • 분리된 메모리 공간을 가지고 있고, CPU와 코어 갯수의 장점을 살릴 수 있음 • CPython 에서 GIL 의 영향을 받지 않음 • CPython 에서 CPU-Bound 작업은 Multiprocessing 으로 처리해야함 • Shared Memory 를 사용하지 않는 한, 대부분의 동기화 문제가 사라짐 • 자식 프로세스들을 interruptible 하고 killable 할 수 있음 • 단점 • IPC 사용이 복잡할 수 있음 • 메모리를 보다 많이 사용할 수 있음 Multiprocessing 33
  • 37. • 비선점 멀티태스킹을 위해 만들어진 서브루틴 • 실행의 정지와 재개를 위한 여러 진입점을 허락 • Exception, Event loops, Iterators, Infinite list, Pipe 등에 적합 Coroutine 37
  • 38. • Subroutine • 처음부터 시작하여, 끝날때 한번 종료됨 • Subroutine 의 Instance 는 한번만 반환함 • 호출간의 상태를 유지하고 있지 않음 • 프로그램 시작전에 할당된 하나의 스택만 있으면 됨 • Coroutine • 다른 Coroutine 을 호출하며, 종료될 수 있고, 원래 로직으로 돌아올 수 있음 • 상태를 유지하며, 호출마다 다름 • 사전에 할당된 스택이나 이전에 할당된 스택을 캐싱하여 저비용으로 만들 수 있음 Subroutine 과의 비교 38
  • 39. • Generator • Semi-Coroutine 이라고도 불림 • 제어권을 여러번 양보할 수 있음 • 실행 중인 작업을 중단하고, 여러 진입점에서 재 진입 할 수 있음 • 제어권을 양보한 뒤에도 실행의 흐름을 제어 할 수 없음 • 컨트롤을 Generator 의 호출자에게 넘김 • Yield 는 반환의 목적 • Coroutine • 제어권을 여러번 양보할 수 있음 • 실행 중인 작업을 중단하고, 여러 진입점에서 재 진입 할 수 있음 • 제어권을 양보한 뒤에도 실행의 흐름을 제어 할 수 있음 • Yield 는 입력의 목적 Generator 와의 비교 39
  • 40. Coroutine in Python (Generator base) 40
  • 41. Coroutine in Python (Generator base) 41
  • 42. Coroutine in Python (Generator base) 42
  • 43. Coroutine in Python (yield from) 43 • yield from • Python 3.3 버전에서 추가됨
  • 44. Concurrent.futures (비동기 Non-blocking) 44 • 멀티프로세싱 및 멀티스레딩을 위한 API 제공 • 다중 스레드와 다중 프로세스에 타겟팅 • Python 3.2 에 추가됨 • 기존에는 스레드, 프로세스 관련 API들이 C 코드의 래핑 수준이었음 • 스레드와 프로세스를 사용하는 API 를 통일
  • 45. Asyncio (단일 스레드 비동기 Non-Blocking 지원) 45 • 비동기 Non-Blocking I/O • I/O 작업에서 불필요하게 기다리는 시간을 비동기로 처리하여 Block 되지 않도록 하는 개념 • NodeJS 에서도 단일 스레드 비동기 I/O 개념을 사용하여 불필 요한 대기 시간을 줄이는 것으로 성능을 향상
  • 46. Coroutine in Python (asyncio) 46 • asyncio • Python 3.4 버전에서 추가됨 • 비동기 프로그래밍을 위한 모듈
  • 47. Coroutine in Python (Native Coroutine) 47
  • 48. Coroutine in Python (Native Coroutine) 48 • asyncio • Python 3.5 버전에서 추가됨 • async 와 await 가 추가됨 • async 는 native coroutine 선언 • await 는 yield 를 대체하는 표현 • 해당 작업이 끝날때까지 대기한다는 의미 • Native Coroutine 과 Generator 기반의 Coroutine 은 혼용해서 사용할 수 없음 • asnyc / await 구문과 yield 를 혼용해서 사용할 수 없음 • Native Coroutine 과 Generator 기반의 Coroutine 은 상호 운영 가능
  • 49. Coroutine in Python (Native Coroutine) 49
  • 50. Coroutine in Python (asyncio) 50
  • 51. Else 51 • Gevent • Libev 기반의 동시성 라이브러리 • 동시성과 네트워크 관련 작업들을 위한 API 제공 • Green Thread를 사용 • Greenlets • Gevent 에서 주로 사용되는 패턴 • C 확장 모듈 형태로 제공되는 경량 코루틴
  • 52. Else 52 • Green Thread • Runtime Library 나 Virtual Machine 에 의해 스케줄링 되는 스레드 • OS 기반으로 스케줄링 되지 않음 • 커널 공간이 아닌 유저 영역에서 관리됨 • Java 의 Thread library 에서 유래함 • CPU 문맥 교환 문제를 제외하고는 일반 스레드가 가진 문제와 동일
  • 53. QnA
  • 54. t h a n k y o u Copyright 2017 Penta Security Systems Inc. All rights reserved. KOREA U.S.A. JAPAN Yeouido, Seoul www.pentasecurity.co.kr (HQ) Houston, Texas www.pentasecurity.com Shinjuku-Ku, Tokyo www.pentasecurity.co.jp