본문 바로가기
반응형

개발 이야기/Python6

Python 이중 for loop 를 itertools 를 활용하여 개선하기 a = [1,2,3,4] b = ['A', 'B'] 의 두 리스트에 대해 (1,A), (1,B), (2,A), (2,B), ... 반복을 하려면 무지성으로 구현했을 때 for x in a: for y in b: function(x, y) 처럼 구현할 수 있다. 하지만 itertools 의 product 를 활용하면 좀 더 깔끔하게 구현이 가능하다 [function(x, y) for x, y in product(a, b)] 2024. 2. 26.
gunicorn 멀티프로세스 Crontab 을 활용한 날짜별 file log 로테이션 돌리기 gunicorn 을 활용하여 멀티프로세스를 이용하는 경우, 그리고 로깅 타입을 TimedRotatingFileHandler 을 이용하는 경우 여러 개의 프로세스가 한 파일에 접근하기 때문에 날짜가 바뀔 때마다 새 파일을 만들어야 하는데 이게 제대로 작동하지 않았다 그래서 메인 log 파일에 계속 누적하여 로그가 쌓이고 있었고, 얼마 지나지 않아 로그 사이즈가 너무 커져서 나중에는 읽기 조차 힘든 지경에 이르렀다. 여러 자료들을 살펴 보았을 때 멀티 프로세스를 쓴다면 곧바로 파일 로테이션 로깅을 사용하지 말고, 작업 큐에게 로그를 전달하여 작업 큐로부터 파일 로테이션을 돌리도록 해주면 된다고 하는데 그냥 가장 간단한 방법으로 처리하면 되지 않을까 하여 크론탭을 이용하게 됐다 크론탭은 정해진 시간, 날짜에 .. 2023. 4. 25.
Multi Thread 결과 값 리턴하여 저장하기 Thread는 보통 현재 메인 Thread 에서 시간을 더 이상 잡아먹지 않기 위해 비동기적으로 작업을 넘겨버리고 주 작업을 하고 싶을 때 사용한다. 따라서 이런 경우는 그렇게 생성한 Thread의 결과가 어떤지 살펴볼 필요가 없을 때이다. 예를 들어, 고객 주문 처리 함수를 구현한다고 가정하면, 고객 주문을 완료 하고 마지막에 고객에게 알림 메시지를 발송하는 기능을 구현한다고 하자. 고객에게 알림 메시지를 발송하기 위해 타 업체의 API를 이용해야 하는데, 만약 타 업체 서버가 점검 중이어서 타임아웃 30초 동안 리스폰스를 받지 못한다면 해당 주문 처리 함수는 30초 동안 진행이 되지 않는다. 따라서 이런 경우에 알림의 성공 유무와 관계 없이 일단 주문처리를 완료하고 싶을 때 Thread를 이용할 수 .. 2021. 7. 22.
베트남어 성조 제거하여 알파벳으로 변환하기 회사에서 다국어를 지원하다보니 베트남어 인풋을 받아 처리를 해야 하는 문제가 생겼다. 고객이 베트남인일 때 알파벳을 입력하는 것은 어려워하지만 베트남어 키보드로 이름을 치는 건 쉽게 할 수 있는데, 문제는 우리가 베트남어를 받아서 영문 알파벳으로 변환을 하여 협력사에 알파벳 이름을 전달해야 한다. 예를 들어, 한 고객의 이름이 Nguyễn Vũ Quốc Anh 이라고 했을 때, 이 이름을 Nguyen Vu Quoc Anh 으로 변환해야 한다. 문제 해결을 위해 베트남어에 사용되는 전체 문자열을 나열하고, 그에 대응하는 알파벳으로 치환해주는 간단한 함수를 구현한다. def remove_accents(input): if not input: return "" s1 = u'ÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚÝàáâãè.. 2021. 6. 30.
Fabric 을 이용하여 쉽고 편한 배포하기 파이썬 프로젝트를 배포할 때 우분투 서버에 직접 접속하여 git pull, 서비스 종료, 서비스 시작 등의 커맨드를 일일이 치는 것보다, 뭔가 스크립트 하나로 쉽게 배포하면 얼마나 좋을까를 고민할 때 쓸 수 있는 파이썬 패키지로 fabric이 있다. fabric을 사용하면 서버에 ssh 접속을 하지 않아도, 스크립트가 알아서 ssh 접속을 한 뒤 미리 정의해둔 명령어들을 자동으로 입력해준다. from fabric.api import * env.roledefs = { 'dev': ['user@dev-example.com',], 'release' : ['user@example.com',] } @roles('dev') def dev(): deploy("dev") @roles('release') def rele.. 2020. 12. 10.
Dictionary List 를 key에 따라 sort 하기 dic_list = [ {'name': 'kim', 'age': 30}, {'name': 'kim', 'age': 23}, {'name': 'lee', 'age': 11}, {'name': 'park', 'age': 25}, ] sorted_list = sorted(dic_list, key=lambda data: (data['name'], data['age'])) name 으로 먼저 정렬 하고, 그 다음 기준인 age에 따라 정렬 나이가 많은 순으로 하고 싶으면 -data['age'] 로 사용 2020. 12. 2.
반응형