使用 Qdrant 的异步 API 构建高效的 Python 应用程序

异步编程正在 Python 生态系统中广泛采用。像 FastAPI 这样的工具已经接受了这种新范式,但它也正在成为以 SaaS 形式提供的 ML 模型的标准。例如,Cohere SDK 提供了异步客户端,以及其同步对应客户端。

数据库通常作为独立服务启动,并通过网络访问。所有与它们的交互都是 I/O 密集型的,可以异步执行,以免浪费时间主动等待服务器响应。在 Python 中,这是通过使用 async/await 语法实现的。这让解释器在等待服务器响应时切换到另一个任务。

何时使用异步 API

如果您正在编写的应用程序永远不会同时支持多个用户(例如,它是一个每天运行一次的脚本),则无需使用异步 API。但是,如果您正在编写一个多个用户将同时使用的 Web 服务,则不应阻塞 Web 服务器的线程,因为它限制了它可以处理的并发请求数。在这种情况下,您应该使用异步 API。

FastAPIQuart 这样的现代 Web 框架开箱即用地支持异步 API。将异步代码与现有同步代码库混合可能是一个挑战。async/await 语法不能在同步函数中使用。另一方面,在异步代码中同步调用 I/O 密集型操作被认为是一种反模式。因此,如果您通过 ASGI 服务器构建异步 Web 服务,则应将异步 API 用于与 Qdrant 的所有交互。

异步使用 Qdrant

运行异步代码最简单的方法是定义 async 函数并使用 asyncio.run 如下方式运行它

from qdrant_client import models

import qdrant_client
import asyncio


async def main():
    client = qdrant_client.AsyncQdrantClient("localhost")

    # Create a collection
    await client.create_collection(
        collection_name="my_collection",
        vectors_config=models.VectorParams(size=4, distance=models.Distance.COSINE),
    )

    # Insert a vector
    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],
            ),
        ],
    )

    # Search for nearest neighbors
    points = await client.query_points(
        collection_name="my_collection",
        query=[0.9, 0.1, 0.1, 0.5],
        limit=2,
    ).points

    # Your async code using AsyncQdrantClient might be put here
    # ...


asyncio.run(main())

AsyncQdrantClient 提供与同步对应客户端 QdrantClient 相同的方法。如果您已经有一个同步代码库,切换到异步 API 就像将 QdrantClient 替换为 AsyncQdrantClient 并在每个方法调用前添加 await 一样简单。

此页面有用吗?

感谢您的反馈!🙏

听到这个消息我们很抱歉。😔 您可以在 GitHub 上编辑此页面,或者创建一个 GitHub 问题。