인사이트마이닝1. 멀티태스킹 (1) 멀티태스킹이란?
- 동시성, 병렬성
1) 동시성 : 여러 가지 일을 빠르게 번갈아 가며 수행해 동시에 수행하는 것처럼 일하는 것을 말한다. 1명의 직원이 2가지 일을 하는 것.
2) 병렬성 : 업무를 분담해서 하는 것. 2명의 직원이 2가지 일을 하는 것.
- 동기 vs 비동기 : 동시성에서 주로 다루게 될 개념이다.
1) 바운드 : 어떤 일을 바로 하지 못하고 대기해야 하는 일을 "바운드(bound)되었다"라고 표현한다.
2) 동기(synchronized) : 어떤 일이 순차적으로 실행됨. 요청과 요청에 대한 응답이 동시에 실행됨 (따라서 요청에 지연이 발생하더라도 계속 대기한다.)
3) 비동기(asynchronous) : 어떤 일이 비순차적으로 실행됨. 요청과 요청에 대한 응답이 동시에 실행되지 않음. 특정 코드의 연산이 끝날 때까지 코드의 실행을 멈추지 않고 다음 코드를 먼저 실행하며, 중간에 실행되는 코드는 주로 콜백함수로 연결하기도 한다.
- I/O Bound vs CPU Bound : 컴퓨터가 일을 수행하면서 뭔가 기다릴 때, 즉 속도에 제한이 걸릴 때는 2가지 경우에 해당하는 경우가 대부분이다.
1) I/O 바운드 : 입력과 출력에서의 데이터(파일)처리에 시간이 소요될 때.
2) CPU 바운드 : 복잡한 수식 계산이나 그래픽 작업과 같은 엄청난 계산이 필요할 때.
2. 멀티태스킹 (2) 프로세스, 쓰레드, 프로파일링
- Porcess(프로세스) : 프로그램을 구동하여 프로그램 자체와 프로그램의상태가 메모리상에서 실행되는 작업 단위
1) os 모듈에서 관련 정보를 얻을 수 있음 : getpid, getuid, getid, getcwd
- Thread(스레드) : 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위이다.
- 프로파일링(Profiling) : 코드에서 시스템의 어느 부분이 느린지 혹은 어디서 RAM을 많이 사용하고 잇는지를 확인하고 싶을 때 사용하는 기법이다. 현재 실행 중인 프로그램의 상태를 확인하는 작업을 코딩하는 것을 말한다.
1) 좀 더 엄밀히 말하면 프로파일링은 애플리케이션에서 가장 자원이 집중되는 지점을 정밀하게 찾아내는 기법이다.
2) 프로파일러는 애플리케이션을 실행시키고 각각의 함수 실행에 드는 시간을 찾아내는 프로그램이다. 즉, 코드의 병목(bottlenectk)을 찾아내고 성능을 측정해 주는 도구이다.
3) profile 모듈, cProfile 모듈, line_profiler 패키지를 이용하면 높은 수준의 프로파일링이 가능하다.
3. 멀티태스킹 (3) Scale Up vs Scale Out
- Scale Up : 단일 서버(하드웨어)의 성능을 증가시켜서 더 많은 요청을 처리하는 방법
1) 데이터 정합성 이슈에서 자유롭다. (장점)
2) 별도의 소프트웨어 라이센스 추가 비용이 발생하지 않는다. (장점)
3) 구현이 어렵지 않다. (장점)
4) 설치 가능한 CPU, 메모리, 디스크 수의 제한이 있다. (단점)
5) 일정 수준이 넘어가는 순간 성능 증가 폭이 미미해진다. (단점)
6) 성능 증가 대비 업그레이드 비용이 굉장히 비싸진다. (단점)
7) 서버는 한 대가 모든 클라이언트의 트래픽을 감당해야 한다. (단점)
- Scale Out : 동일한 사양의 새로운 서버를 추가하여 성능을 증가시키는 방법
1) 가용성을 높일 수 있다. (장점)
2) 확장에 유연해 진다. (장점)
3) 병목현상을 줄일 수 있다. (장점)
4) 소프트웨어 라이센스 비용이 증가한다. (단점)
5) 데이터 불일치가 잠재적으로 발생한다. (단점)
- 무엇을 선택해야 할까 -> 각각 장단점이 존재하므로 적절한 시스템을 사용해야 한다.
4. 파이썬에서 멀티스레드 사용하기 (1) 스레드 생성
- 파이썬에서 멀티스레드의 구현은 threading 모듈을 이용한다.
5. 파이썬에서 스레드 / 프로세스 풀 사용하기
- concurrent.futures 라이브러리를 이용하여 사용해보기 : Executor객체, ThreadPoolExecutor객체, ProcessPoolExecutor객체, Future객체
- 여기서는 Thread / Process Pool 구현에 필요한 부분만 살펴본다.
1) ThreadPoolExecutor : Executor객체를 이용하면 스레드 생성, 시작, 조인 같은 작업을 할 때, with컨텍스트 관리자와 같은 방법으로 가독성 높은 코드를 구현할 수 있다.
2) multiprocessing.Pool : multiprocessing.Pool.map을 통해 여러 개의 프로세스에 특정 함수를 매핑해서 병렬처리하도록 구현하는 방법이 널리 사용된다.
'공부 > AIFFEL' 카테고리의 다른 글
FUNDAMENTAL 17. 어라, 이 시계열 데이터 이상한데? - Anomaly Detection (0) | 2021.02.05 |
---|---|
Exploration 9 : 나의 첫 번째 캐글 경진대회, 무작정 따라해보기 (0) | 2021.02.05 |
Exploration 8 : 아이유팬이 좋아할 만한 다른 아티스트 찾기 (0) | 2021.02.03 |
풀잎스쿨 - DeepML(CS231N) Lec. 06 (0) | 2021.02.01 |
FUNDAMENTAL 15. 선형 회귀와 로지스틱 회귀 (0) | 2021.02.01 |