multiprocessing 파이썬은 기본적으로 여러 CPU를 사용하지 않는다. 단일 코어 시대에 설계 되었고 병렬 처리를 효율적으로 실행하기가 어렵기도 하다. 로직을 병렬화하면 N배의 속도를 기대하지만 실제로는 프로세스간 통신 비용이 발생 등 N배 만큼에 성능 향상이 이루어지지는 않는다. 또는 어떻게 설계하냐에 따라서 오히려 더 느려지는 경우도 있기 때문에 설계를 잘 해야한다. multiprocessing 모듈은 프로세스와 스레드 기반의 병렬 처리를 사용해 작업 대기열을 분산시키고 프로세스 간에 데이터를 공유할 수 있도록 한다. 작업을 병렬화 하려면 순차적으로 작성하는 방식과는 달리 다른 관점으로 작성을 해야하며 일반적으로 디버깅이 어렵다. 따라서 성능도 중요하지만 유지보수 측면에서 단순하게 작성을 해..
비동기 I/O 개발 업무를 하면서 실제 코드 자체보다는 코드에 필요한 데이터를 얻어오는 작업이 병목이 생기는 것을 많이 겪었을 것이다. 이런경우 프로그램 I/O 위주라 하고 I/O 효율이 속도를 제한 한다는 것을 의미한다. I/O는 프로그램 흐름에 큰 영향을 미친다. 파일이나 네트워크 소켓 연결을 통해 데이터를 읽을 때까지 실행을 멈추고 커널에 연산을 요청한 후 끝날때 까지 기다려야 하기 때문이다. 비동기 I/O를 활용하면 I/O 연산을 기다리는 동안 다른 연산을 수행하여 유휴 시간을 활용할 수 있다. 작업1,2,3 을 순차적으로 실행한다면 지연을 세번 감수해야 하지만 세 작업을 동시에 실행한다면 시간을 감소할 수 있을 것이다. 파이썬에서는 제너레이터 기반의 Coroutine과 async 함수로 Nati..
사전(dict)과 셋(set) dict와 set은 미리 정해진 순서로 정렬 되지 않는다. dict와 set의 차이점은 set은 key만 가지고 있다는 것이다. 리스트와 튜플은 경우에 따라 검색을 O(logN) 시간 복잡도로 구현할 수 있다. 반면, dict와 set은 O(1)이다. dict와 set은 보통 많은 메모리를 사용한다. 또 해시 함수에 의존 함으로 해시 함수가 느리다면 연산속도도 느릴 것이다. 리스트와 사전 검색 성능 차이 리스트 or 튜플로 구현시 O(N) dict로 구현시 O(1) phonebook_list = [ ("홍길동", "010-1111-1111"), ("김철수", "010-1111-1234"), ("국영수", "010-1234-1234"), ] def find_phonebook_..
튜플 튜플은 한번 생성되면 내용이나 크기를 변경할 수 없지만 두 튜플을 합칠 수는 있다. >>> t1 = (1,2,3) >>> t2 = (4,5,6) >>> t1 + t2 # (1,2,3,4,5,6) 튜플은 합치면 항상 메모리에 새로운 튜플을 새로 할당 한다. 또 튜플은 여유공간을 할당하지 않기 때문에 자원을 더 적게 사용한다. l = [i for i in range(100000)] t = tuple(l) print('list', sys.getsizeof(l)) print('tuple', sys.getsizeof(t)) list 824464 tuple 800048이 때문에 정적인 데이터를 다룰때는 리스트보다는 튜플이 좋다. 또한 튜플은 정적이기에 리소스 캐싱을 하는데 크기가 ..
리스트 리스트는 동적 배열로 크기를 자유자재로 조절할 수 있는데 이러한 변경 가능한 특성 때문에 리스트는 메모리와 추가 연산을 필요로 한다. 리스트에 object 추가 시 기존에 object들과 추가되는 object를 새로운 리스트를 추가하여 생성한다. 새로 추가된 리스트의 크기는 기존 N개와 추가되는 1개 더하여 N+1이 아니라 M개 (M > N+1) 의 크기를 가진다. 크기에 여유를 두는 이유는 메모리 할당과 복사 요청 횟수를 줄이기 위하여다. 리스트의 크기 1을 할당한 이후 크기는 동일하다가 5를 할당하니 크기가 커진다. 이는 새로 리스트를 생성한 것. a = [] print('0', sys.getsizeof(a)) a.append(1) print('1', sys.getsizeof(a)) a.app..
프로파일링으로 병목지점 찾기 cProfile 감으로 코드를 작성하는 습관을 버리고 가설을 세우고 프로파일링을 통한 검증으로 코드를 작성해라. 이는 시간을 투자 할만한 가치가 충분하고 코드 작성의 근거가 될 수 있다. cProfile 테스트 테스트 코드 피보나치 수열을 dp와 recursion 으로 구현한 함수 def fibonacci_dp(n): dp = [0, 1] for i in range(2, n + 1): dp.append(dp[i - 1] + dp[i - 2]) return dp[n] def fibonacci_recursion(n): if n python -m cProfile -s cumulative High-Performance-Python\2-프로파일링으로-병목지점-찾기\2-1-cProfil..
이해하기 어느 search 가 빠르고 느린지 확인 하는 방법 import csv def search_fast(haystack, needle): for item in haystack: if item == needle: return True return False def search_slow(haystack, needle): is_exist = False for item in haystack: if item == needle: is_exist = True return is_exist def search_unknown_1(haystack, needle): return any((item == needle for item in haystack)) def search_unknown_2(haystack, needle..
문제 https://www.acmicpc.net/problem/11724 11724번: 연결 요소의 개수 첫째 줄에 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2) 둘째 줄부터 M개의 줄에 간선의 양 끝점 u와 v가 주어진다. (1 ≤ u, v ≤ N, u ≠ v) 같은 간선은 한 번만 주 www.acmicpc.net 문제 해결방법 bfs 로 해결 가능 노드별로 방문 결과에 대해 방문결과 값을 업데이트 하고 방문결과가 있는 노드는 skip 하고 방문 안한 노드는 방문해서 총 몇번 반복 되는지 문제 풀이 import sys from collections import deque N, M = map(int, sys.stdin.readline().st..
문제 https://www.acmicpc.net/problem/7576 7576번: 토마토 첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토 www.acmicpc.net 문제 해결방법 bfs 로 해결 가능하다. 입력 조건으로 토마토는 1개이상이 들어갈수 있기 때문에 bfs 실행 전에 토마토의 위치를 큐에 넣어줘야 한다. 그 이후에 bfs 함수에서 인접열 방문시에 0(익지않은 토마토) 값이라면 기준열 토마토가 익는데 걸리시간에서 +1일을 해준다. bfs 종료 후 만약 graph 내에 0이 아닌 값이 있다면 -1로 인해서 인접열 방문 실패한 경우..
문제 https://www.acmicpc.net/problem/1012 1012번: 유기농 배추 차세대 영농인 한나는 강원도 고랭지에서 유기농 배추를 재배하기로 하였다. 농약을 쓰지 않고 배추를 재배하려면 배추를 해충으로부터 보호하는 것이 중요하기 때문에, 한나는 해충 방지에 www.acmicpc.net 문제 해결방법 bfs 로 해결 가능 graph[y][x] == 1 인 곳에서 검색을 시작하여 인접한 부분을 모두 0으로 변경한 뒤에 count++ 문제 풀이 import sys from collections import deque T = int(sys.stdin.readline().strip()) dx = [0, 0, 1, -1] dy = [1, -1, 0, 0] for _ in range(T): M, ..
문제 https://www.acmicpc.net/problem/2667 2667번: 단지번호붙이기 과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여 www.acmicpc.net 문제 해결방법 bfs 로 해결 가능 graph[i][j] 가 1인 곳에서 검색을 시작해서 인접한 부분을 찾고 종료시 count return 문제 풀이 import sys from collections import deque N = int(sys.stdin.readline().strip()) boards = [] for _ in range(N): boards.append(list(map(int,..
Airflow Concepts Airflow 는 프로그래밍을 통해서 workflows를 작성하고 스케쥴링 하고 모니터링 하는 플랫폼 이다. Airflow 는 Directed Acyclic Graphs(DAGs)을 통해서 workflows를 작성하며 Airflow 스케줄러는 지정된 종속에 따라서 array of workers를 이용하여 Task를 실행 한다. DAG은 tasks 사이에 종속성과 실행될 순서, 재시도를 명시 해야하며, Taks는 무엇을 할지 작성하여야 한다. Strength points Airflow는 Python 기반으로 쉽게 작성 가능하며 콘솔을 통해서 Task 작업 확인과 bottleneck을 찾을때도 유용하다. Install Requirements 적어도 4Gb 이상의 메모리 이상이여..
Web RTC Web RTC (Web Real-Time Communication)는 웹 브라우저 간에 플러그인의 도움 없이 서로 통신할 수 있도록 설계된 API이다. W3C에서 제시된 초안이며, 음성 통화, 영상 통화, P2P 파일 공유 등으로 활용될 수 있다. 두레이 화상회의도 Web RTC 를 이용해서 구현 되어 있다. 통신 방법 Web RTC 는 P2P 통신에 최적화 되어 있으며 크게 3가지 클래스로 실시간 데이터 교화이 이루어진다. MediaStream - 카메라/마이크 등 데이터 스트림 접근 RTCPeerConnection - 암호화, 대역폭 관리 및 오디오, 비디오 연결 RTCDataChannel - 일반적인 데이터 P2P 통신 위 3가지를 통해서 데이터 교환이 이루어 지며 RTCPeerCon..
Json Web Token JWT 는 요청자/응답자 간에 JSON 객체를 안전하게 전송할 수 있는 간결하고 자기 포함된 개방형 표준(RFC 7519) 정보는 디지털 서명되어 있어 신뢰할 수 있으며 Secret(HMAC 알고리즘), RSA나 ECDSA 를 이용한 public/private 키를 이용하여 서명할 수 있다. JWT 사용 하는 케이스 Authorization JWT를 사용하는 흔한 케이스. 유저 로그인 후, 요청에 대해서 JWT가 포함 될 것이고 이를 통해서 route, service, resource 등 허용/비허용 제한할 수 있다. Single Sign On 은 도메인간에 쉽게 사용 가능하며 작은 자원을 사용해 최근 많이 사용 된다. Information Exchange JWT는 요청/응답간..
비동기 메시징 패턴 응용 통신 비동기 메시징은 메시지 브로커를 사용하는 경우 브로커 없이 서비스가 직접 하는 경우가 있다. 메시지 메시지는 Header와 Body 로 구성. 브로커를 사용하는 경우 메시지 채널을 통해서 교환 된다. 메시징 상호작용 클라이언트/서비스는 한 쌍의 메시지를 주고받는 비동기 요청/응답 스타일로 상호작용 한다. 클라이언트는 수행 작업과 매개변수를 메시징 요청 채널에 보내고 서비스는 요청 처리 후 메시지 응답 채널로 응답 한다. 클라이언트 → 요청 채널 → 서비스 → 응답 채널 → 클라이언트 구현 방법 단방향 알림 비동기 메시징을 이용하여 클라이언트만 서비스에 요청하고 서비스는 응답 하지 않음 발행/구독 메시징은 발행/구독 스타일을 기본 지원한다. 클라이언트는 여러 Consumer가..
MSA 프로세스 통신 2 부분 통신 실패 : 회로 차단기 패턴 항상 서비스는 실패할 가능성에 대해 오픈 마인드다. 한개 서비스 호출 불가는 전체 서비스에 대해 영향을 미침으로 서비스 부분 실패가 전체에 영향 가지 않도록 설계를 해야 한다. RPI 프록시 설계 Netflix는 다음과 같이 실패에 대해 처리한다. 네트워크 타임아웃: 응답에 대해 항상 Timeout 설정, 불필요한 리소스 사용 방지 미처리 요청 개수 제한: 최대 요청 횟수를 설정하여 초과시 요청을 포기하도록 한다. 회로 차단기 패턴: 서비스에 성공/실패에 대해서 counting을 하고 일정 임계치를 초과하면 그 이후에 요청은 포기한다. 부분 실패시 미리 정해진 default 값이나 캐시된 값 등을 반환하는 방법이 있다. 서비스 디스커버리 클라..
MSA 프로세스 통신 IPC 개요 통신 상호작용 기준 첫번째 일대일: Client의 요청은 한개의 서비스가 처리 일대다: Client의 요철을 여러개의 서비스가 처리 두번째 동기: Client가 서비스에게 요청하고 응답 대기를 하며 블로킹도 할 수 있음 비동기: Client가 블로킹 하지 않으며 응답은 바로 하지 않아도 됨 통신 상호작용 종류 요청/응답 : Client는 서비스에 요청을 하고 응답 대기. 강한 결합의 상호작용 스타일 비동기 요청/응답 : Client는 서비스에 요청을 하고 서비스는 비동기적으로 응답 단방향 알림 : Client는 요청만 하고 서비스는 응답을 하지 않음 API 설계 API 기능 추가/변경/삭제 등을 통해서 충분히 변경될 수 있다. 따라서 이런 문제를 해결하기 위해서 프로젝트..
마이크로서비스 아키텍쳐 3단계 프로세스 1단계는 요청을 추출, 요청에 대해서 추상적으로 관찰 해야 합니다. 2단계는 어떻게 서비스로 분해할지 결정 해야 합니다. 3단계는 서비스별 API를 정의하고 서비스에 역할 배정 및 서비스간 협동에 대해서 정의를 해야 합니다. # 1단계. 시스템 작업 식별 시스템 작업을 기술하기 위한 고수준 도메인 모델을 생성한다. 위 그림을 통하면 이는 Order, Delivery, Restaurant 로 추출할 수 있다. 고수준의 도메인 모델로 나누기 위해서는 시나리오 작성을 통해서 하는 방법이 있다. 전제 (Given) - 소비자가 있다. - 음식점이 있다. - 음식점은 소비자의 주소로 음식을 배달 한다. - 주문 총액은 최소 주문량 조건에 부합해야 한다. 조건 (When) -..