Skip to content

Qdrant Async API

Python 생태계는 비동기 프로그래밍(async/await) 을 표준으로 빠르게 받아들이고 있다.

FastAPI·Quart 같은 현대적 웹 프레임워크나 Cohere SDK 등 SaaS ML 모델 클라이언트도 모두 비동기 API를 제공한다.

데이터베이스 역시 네트워크를 통한 IO-bound 작업이므로, 비동기로 처리하면 대기 시간 동안 스레드를 점유하지 않아 동시성을 크게 높일 수 있다.

언제 Async API를 써야 하는가

상황 선택
단발성 스크립트·배치처럼 동시 사용자가 없는 경우 동기 API도 무방
FastAPI 등 ASGI 웹 서비스·챗봇처럼 요청이 동시에 들어오는 경우 AsyncQdrantClient 사용 권장

동기 코드 내에서는 await를 사용할 수 없고, 비동기 컨텍스트에서 동기 IO를 호출하면 이벤트 루프가 블로킹되므로 혼용은 지양해야 한다.

기본 사용 패턴

  1. AsyncQdrantClient 인스턴스를 생성한다.

  2. 모든 Qdrant 호출 앞에 await 를 붙인다.

  3. 진입점은 async 함수로 작성하고, 모듈 최상위에서 asyncio.run() 으로 실행한다.

import asyncio
from qdrant_client import AsyncQdrantClient, models

async def main():
    # 1) 비동기 클라이언트 생성
    client = AsyncQdrantClient("http://localhost:6333")

    # 2) 컬렉션 생성
    await client.create_collection(
        collection_name="my_collection",
        vectors_config=models.VectorParams(size=4, distance=models.Distance.COSINE),
    )

    # 3) 데이터 삽입
    await client.upsert(
        collection_name="my_collection",
        points=[
            models.PointStruct(
                id="5c56c793-69f3-4fbf-87e6-c4bf54c28c26",
                payload={"color": "red"},
                vector=[0.9, 0.1, 0.1, 0.5],
            )
        ],
    )

    # 4) 질의
    result = await client.query_points(
        collection_name="my_collection",
        query=[0.9, 0.1, 0.1, 0.5],
        limit=2,
    )
    print(result.points)

# 5) 이벤트 루프 실행
asyncio.run(main())

AsyncQdrantClient 는 동기 버전(QdrantClient)과 메서드 시그니처가 동일하므로, 기존 동기 코드베이스를 마이그레이션할 때

  • QdrantClientAsyncQdrantClient 로 교체

  • 각 호출 앞에 await 추가

  • 호출 체인이 async 함수가 되도록 조정

정도만 해주면 된다.

유의 사항

  • 비동기 컨텍스트 필수: await 는 이벤트 루프 안에서만 동작한다. Jupyter Notebook에서는 nest_asyncio 등으로 루프 중첩을 허용하거나, IPython의 await 지원을 활용한다.

  • IO-bound 전용: CPU-bound 작업은 async 와 무관하다. CPU 작업은 별도의 스레드/프로세스 풀 또는 비동기 작업 큐로 분리하는 편이 낫다.

  • 타 SDK도 async 사용: Cohere·OpenAI Python 등 다른 비동기 클라이언트와 결합할 때 역시 동일하게 await 를 붙여야 한다.

비동기 API를 사용하면 스레드 블로킹 없이 데이터베이스·외부 API 호출을 병렬로 처리할 수 있으므로, Python 웹 서비스의 처리량과 응답성을 크게 개선할 수 있다. Qdrant의 AsyncQdrantClient 를 적극 활용하여 고성능 비동기 애플리케이션을 구축하기 바란다.