python 24

[python] 파이썬 동시성 프로그래밍

동시성 프로그래밍에 대해서 알기 위해서는 Bound, Thread, Process, Sync, Async라는 개념들을 알고 넘어갈 필요가 있습니다. Bound부터 하나씩 알아보도록 하겠습니다. Bound 동시성 프로그래밍에 대해서 공부하려면 먼저 Bound라는 개념을 알고 갈 필요가 있는데, Bound는 묶인단 뜻으로 작업을 하면서 묶이게 되는 시간을 뜻 합니다. Bound는 CPU Bound와 I/O Bound 2가지로 나뉩니다. CPU Bound CPU를 활용하는 작업에 따라 기다리게 되는 구간을 뜻 합니다. ex) 수학 연산, 딥러닝 연산, 이미지 처리 등 I/O Bound I/O 작업에 대해서 기다리는 구간을 뜻 합니다. ex) 파일 입출력, 네트워크 요청 등 Thread vs Process Th..

python 2024.03.31

[fastapi] lifespan

Lifespan fastapi를 사용하면서, 앱이 시작할 때 혹은 앱이 종료될 때에 실행되어야 하는 로직이 분명 존재하게 됩니다. 저는 모니터링 관련 세팅이 앱 시작할 때 주로 실행되도록 구성을 많이 하고 있는데요. 이런 세팅들을 명시적으로 실행 위치를 정해주는 기능이 fastapi에 존재합니다. lifespan이라는 기능인데, 오늘은 fastapi의 lifespan을 소개해보겠습니다. 먼저 위에서 언급했듯이, 앱이 시작하기 전 혹은 종료 시 실행되어야 하는 로직을 정하고 lifespan 함수를 선언해서 함수 안에 로직들을 작성하고 연결만해주면 됩니다. 바로 예시 코드를 보면서 소개드리겠습니다. 아래 코드는 fastapi 공식 문서에 소개된 코드입니다. (https://fastapi.tiangolo.co..

python/fastapi 2024.03.03

[Python] contextvars

fastapi가 등장한 이후로, python에서도 비동기로 구현하는 방식이 많이 활성화되고 있습니다. 멀티 스레딩으로 구현할 때는, thread의 context를 활용해서 로그를 남겨서 쉽게 모니터링 할 수 있었는데 비동기에서는 thread context가 없어서 해당 부분을 해소하기 위해서 등장한 것이 contextvars입니다. contextvars는 파이썬 표준 라이브러리로 따로 설치를 해야하는 것은 없습니다. 사용법은 매우 간단합니다. ContextVar를 한 번 선언을 하고, set 함수를 호출하여 context를 설정해주면 get 함수를 호출해서 가져다 쓸 수 있습니다. 바로 예시 코드를 보겠습니다. import asyncio import contextvars import random impo..

python 2024.01.07

[fastapi] Middleware

오늘은 fastapi의 middleware에 대해서 알아보려고 합니다. https://fastapi.tiangolo.com/tutorial/middleware/ Middleware - FastAPI FastAPI framework, high performance, easy to learn, fast to code, ready for production fastapi.tiangolo.com fastapi의 middleware를 활용하면, 모든 request에 대해서 전/후 처리를 추가해줄 수 있습니다. 바로 예시 코드를 보도록 하겠습니다. import time from fastapi import FastAPI, Request app = FastAPI() @app.middleware("http") async..

python/fastapi 2023.07.02

[fastapi] fastapi utils를 활용한 주기적인 작업(periodic task) 실행하기

백엔드 서버를 띄운 상황에서, 주기적인 작업(periodict task, repeated task)을 실행하고 싶은 경우가 생길 수 있습니다. 예를 들면, DB에 주기적으로 polling을 해서 어떤 데이터를 가져와서 서버에서 들고 있게 하는 등의 작업이 필요할 수 있는데요. fastapi 자체적으로 제공하는 것은 없지만, fastapi-utils(https://fastapi-utils.davidmontague.xyz/)를 활용하면 이런 작업을 수행할 수 있습니다. 설치는 pip로 간단하게 하시면 됩니다. pip install fastapi-utils fastapi-utils를 활용하여 주기적인 작업을 실행하는 방법은 아래와 같습니다. from fastapi import FastAPI from sqlal..

python/fastapi 2023.06.18

[fastapi] background task

개요 background task를 처리하는 방식은 다양한데, fastapi의 framework 내에서도 충분히 처리를 할 수 있어서 그 방식에 대해서 정리를 해보려고 합니다. background task는 API 요청을 받아서 실시간으로 응답을 바로 주는 것이 아닌 API 요청에 대해서 별도로 천천히 처리해도 되는 작업들에 사용하게 됩니다. 예를 들면 회원가입을 할 때, 회원가입을 완료했을 때 성공했다는 응답을 반환하고 email로 환영 메세지를 발송하는 것과 같은 경우가 있을 수 있습니다. 사용방법 사용 방법은 공식 홈페이지에 잘 나와있습니다. (https://fastapi.tiangolo.com/tutorial/background-tasks/) 문서의 예시 코드를 한 번 보도록 하겠습니다. fr..

python/fastapi 2023.06.04

python asyncio gather vs wait

개요 파이썬에서 fastapi가 점점 많이 사용되고 있다보니 자연스럽게 async를 사용해서 코딩을 하게 되는 것 같습니다. async에서 제일 착각하기 쉬운게, async 함수를 연속으로 사용하면 비동기로 동시에 처리될 것이라고 생각할 수 있는데요. 아래 코드를 실행해보면, 총 2초가 걸리는 것을 확인할 수 있습니다. import time import asyncio async def method1(): await asyncio.sleep(1) async def method2(): await asyncio.sleep(1) async def main(): await method1() await method2() if __name__ == "__main__": start = time.time() asynci..

python 2023.05.21

SQLAlchemy ORM & async 활용 (2.0.X)

SQLAlchemy에서 2.0 버전이 나와서 문법이 꽤 많이 변경되었습니다. 그래서 오늘은 변경된 ORM 문법과 함께 async로 접근하는 방법을 알아보았습니다. 변경된 ORM 문법을 바로 보도록 하겠습니다. from datetime import datetime from sqlalchemy import String, BIGINT from sqlalchemy.dialects.mysql import DATETIME from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column class Base(DeclarativeBase): type_annotation_map = { int: BIGINT, datetime: DATETIME } class User(Ba..

python/SQLAlchemy 2023.02.26

SQLAlchemy에서 ORM 활용하기

이전 글(https://seokhyun2.tistory.com/84)에서 SQLAlchemy에 대해서 소개를 해보았는데요. 오늘은 ORM을 활용하는 방법을 준비해보았습니다. ORM을 사용하기 위해서는, table에 매핑되는 class를 선언해서 사용하면 되는데요. 바로 예제 코드를 보도록 하겠습니다. from sqlalchemy.orm import declarative_base from sqlalchemy import Column, Integer, String, DateTime from sqlalchemy.sql import func Base = declarative_base() class User(Base): __tablename__ = 'users' id = Column(Integer, primary..

python/SQLAlchemy 2022.09.04

SQLAlchemy 소개 및 활용법

딥러닝 모델을 서비스에 적용하다보면, 실시간 서빙 뿐만 아니라 데이터베이스를 활용하여 데이터베이스에 딥러닝 모델의 인퍼런스 결과를 저장해두고 저장된 결과를 활용하여 서비스를 제공하기도 합니다. 자연어처리에서 예를 들면, 미국 신문 기사에 대한 번역 서비스를 제공한다고 할 때, 미국 신문 기사를 데이터베이스에 저장하면서 번역 결과도 같이 저장을 해둔다면 유저가 접속할 때 마다 번역할 필요가 없겠죠? 그래서 딥러닝 모델을 서비스에 제공하다보면, 데이터베이스에 대한 지식도 필요하게 됩니다. SQLAlchemy? SQLAlchemy는 그 자체가 데이터베이스 클라이언트는 아닙니다. 데이터베이스 클라이언트 라이브러리는 별도로 활용하고, 오늘 소개드릴 SQLAlchemy는 ORM(Object Relational Ma..

python/SQLAlchemy 2022.08.21