ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

LanceDB Python 从同步 API 迁移到异步 API 完整指南:connect_async 与 AsyncConnection/AsyncTable 实战

LanceDB Python 从同步 API 迁移到异步 API 完整指南:connect_async 与 AsyncConnection/AsyncTable 实战 向量数据库数据库人工智能后端【免费下载链接】lancedbDeveloper-friendly OSS embedded retrieval library for multimodal AI. Search More; Manage Less.项目地址https://gitcode.com/gh_mirrors/la/lancedb点击查看免费下载导读LanceDB 为 Python 绑定引入了一套全新的异步 API它直接构建在 rust lancedb crate 之上而非旧版基于 pylance 的同步实现从而让 Python、Node.js 等各语言绑定在行为上保持一致。本篇指南以仓库内 python/ASYNC_MIGRATION.md 为骨架结合 python/python/lancedb/init.py 与 python/python/lancedb/table.py 的源码实现系统讲解同步到异步迁移中的三个核心变化几乎所有方法变为async、Connection/Table新增close与上下文管理器语义、Table.schema由属性变为异步方法以及len(table)的移除。读完本文你将能把现有同步代码平滑迁移为await驱动的异步代码并正确管理连接与表对象的生命周期。一、异步 API 的定位与设计动机异步 API 并不是在同步 API 外面包一层asyncio封装那么简单。从源码看connect_async直接调用 Rust 层的异步入口。在 python/python/lancedb/db.py 中可以看到核心连接逻辑async def do_connect(): return await lancedb_connect( sanitize_uri(uri), None, None, ... )即异步连接通过lancedb_connectRust 导出建立AsyncConnection只是对LanceDbConnection的 Python 包装见 db.py。这意味着各语言绑定Python / Node.js / Java共享同一套 Rust 内核行为一致性更高异步 API 可以直接支持 LanceDB Cloud 的 OAuth 认证connect_async支持oauth_config参数而同步connect对db://URI 仍使用 API Key见init.py。二、核心变化一几乎所有函数都变成 async迁移中最重要的一点几乎所有函数现在返回asyncio协程调用时必须使用await。同步写法import lancedb db lancedb.connect(./.lancedb) table db.open_table(my_table) print(table.schema) print(table.count_rows())异步写法import lancedb async def main(): db await lancedb.connect_async(./.lancedb) table await db.open_table(my_table) print(await table.schema()) print(await table.count_rows()) import asyncio asyncio.run(main())从类型标注也可以直接确认这一变化python/python/lancedb/_lancedb.pyi 中Connection的close是async def close(self)Table的schema是async def schema(self) - pa.Schema、count_rows是async def count_rows(self, filter: Optional[str]) - int见 _lancedb.pyi。也就是说凡是涉及 IO 的操作——打开表、建表、增删改查、建索引、计数——都需要await。三、核心变化二Connection 新增 close 与上下文管理器3.1 为什么要 closeAsyncConnection现在带有一个close方法用于主动eagerly释放底层资源。当前阶段close 主要释放远程连接LanceDB Cloud的 HTTP 连接本地原生连接目前不持有打开的资源但未来可能加入共享缓存、目录服务连接等资源见 db.py 的类文档注释。因此即使你只使用本地连接养成调用close的习惯也是好的实践。3.2 三种关闭方式方式一显式调用closeimport lancedb async def main(): db await lancedb.connect_async(./.lancedb) # ... 使用连接 ... db.close()注意close是同步方法def close(self)见 db.py不需要await且可以安全地多次调用。关闭后再使用连接会抛错。is_open()可以查询连接状态。方式二作为上下文管理器推荐import lancedb async def main(): with await lancedb.connect_async(/tmp/my_dataset) as conn: # do something with the connection pass # conn 在这里已经关闭这一写法来自 db.py 的官方 docstring 示例。AsyncConnection实现了__enter__/__exit__退出上下文时自动调用close见 db.py。方式三依赖垃圾回收调用close并不是强制的。如果不调用连接会在对象被垃圾回收时自动关闭。这也是官方文档明确说明的行为见 ASYNC_MIGRATION.md。3.3 连接的线程与生命周期语义从源码注释可以进一步确认见 db.py连接可以在多线程间共享且预期是长生命周期对象很多场景下一个连接可以在整个应用生命周期内复用此时并不需要每次用完就关闭关闭是可选操作未关闭时对象被删除即自动关闭。四、核心变化三Table 新增 close 与生命周期管理AsyncTable同样提供了close方法用于主动释放 Table 对象持有的索引缓存index data cache。AsyncTable 对象预期是长生命周期、可复用多次操作的它会缓存一定量的索引数据在内存中该缓存会在 Table 被垃圾回收时释放也可以调用close立即释放见 table.py 的类文档注释。同样支持上下文管理器退出上下文自动关闭见 table.pyimport lancedb async def main(): with await lancedb.connect_async(./.lancedb) as db: table await db.open_table(my_table) with table: # ... 使用 table 执行查询 pass # table 在这里已关闭不可再使用注意Table 一旦关闭就不能再进行任何后续操作见 table.py。与连接一样关闭是可选的is_open()可查询状态。五、核心变化四Table.schema 从属性变成异步方法旧版同步 API 中Table.schema是属性property直接读取即可。新异步 API 中schema变成了async 方法必须调用await table.schema()。# 旧写法同步 API schema table.schema # 新写法异步 API schema await table.schema()在 table.py 中AsyncTable.schema被定义为async def schema(self) - pa.Schema返回 Arrow Schema。与之相关的一个常见模式是配合嵌入函数注册表解析 schema 元数据中的嵌入函数from lancedb.embeddings import EmbeddingFunctionRegistry async def get_functions(table): schema await table.schema() return EmbeddingFunctionRegistry.get_instance().parse_functions(schema.metadata)这与 table.py 中AsyncTable.embedding_functions的实现逻辑一致它内部就是先await self.schema()再解析元数据。六、核心变化五len(table) 被移除改用 count_rows同步 API 中可以使用len(table)获取行数新异步 API移除了Table.__len__len(table)不再可用必须改用count_rows# 旧写法同步 API n len(table) # 新写法异步 API n await table.count_rows() # 也支持带过滤条件的计数 n await table.count_rows(filterb 2)AsyncTable.count_rows定义在 table.py签名是async def count_rows(self, filter: Optional[str] None) - int可以传入可选的 SQL 过滤表达式进行条件计数。相应地同步Table抽象基类中的count_rows定义于 table.pypyarrow集成的Dataset适配层也通过self.table.count_rows(self.filter)转发见 python/python/lancedb/integrations/pyarrow.py说明这一语义在同步与异步两条 API 上是统一的。七、迁移速查表同步 APIpylance异步 APIrust lancedb说明lancedb.connect(uri)await lancedb.connect_async(uri)返回AsyncConnectiontable.schema属性await table.schema()属性变 async 方法len(table)await table.count_rows()/await table.count_rows(filter...)__len__已移除无依赖 GCconn.close()/with await connect_async(...) as conn:主动释放远程 HTTP 连接无依赖 GCtable.close()/with table:主动释放索引缓存—conn.is_open()/table.is_open()查询对象是否仍可用八、完整的端到端迁移示例最后给出一个从建表、写数据到查询的完整异步示例综合自 table.py 的官方 docstring 示例import asyncio import lancedb async def create_and_search(): # 1. 建立异步连接作为上下文管理器退出自动 close with await lancedb.connect_async(./.lancedb) as db: # 2. 建表数据为 dict 列表vector 维度需一致 data [{vector: [1.1, 1.2], b: 2}] table await db.create_table(my_table, datadata) print(await table.query().limit(5).to_arrow()) # 输出类似 # vector: fixed_size_listitem: float[2] # b: [[2]] # 3. 追加数据 await table.add([{vector: [0.5, 1.3], b: 4}]) # 4. 向量检索 results await table.vector_search([0.4, 0.4]).select([b, vector]).to_pandas() print(results) # 输出类似 # b vector _distance # 0 4 [0.5, 1.3] 0.82 # 1 2 [1.1, 1.2] 1.13 asyncio.run(create_and_search())如果连接与表都是长生命周期对象也可以选择不关闭交由垃圾回收处理但在 LanceDB Cloud 场景下建议显式close或使用上下文管理器及时释放 HTTP 连接资源。延伸阅读迁移说明原文python/ASYNC_MIGRATION.md异步连接实现python/python/lancedb/db.pyAsyncConnection类位于L1757起异步表实现python/python/lancedb/table.pyAsyncTable类位于L4984起异步入口函数connect_asyncpython/python/lancedb/init.py异步类型桩async def签名全集python/python/lancedb/_lancedb.pyi同步与异步的count_rows语义对齐参考python/python/lancedb/integrations/pyarrow.py赞分享向量数据库数据库人工智能后端【免费下载链接】lancedbDeveloper-friendly OSS embedded retrieval library for multimodal AI. Search More; Manage Less.项目地址https://gitcode.com/gh_mirrors/la/lancedb点击查看免费下载相关推荐WebdriverIO 从同步到异步迁移完整指南SyncAsyncMigration 实战手册WebdriverIO 从同步到异步迁移完整指南SyncAsyncMigration 实战手册 本文基于 WebdriverIO 官方迁移文档 SyncAs测试质量保障Meteor 2.8 迁移指南MongoDB 异步 API 与 Meteor.callAsync 完整实战Meteor 2.8 迁移指南MongoDB 异步 API 与 Meteor.callAsync 完整实战 Meteor 2.8 是 Meteor 从基于 F后端前端开发工具移动开发Meteor 3 异步函数完全指南从回调到 Promise 的 API 迁移实战Meteor 3 异步函数完全指南从回调到 Promise 的 API 迁移实战 Meteor 3 将 Promise 作为所有异步操作的标准 API大量回后端前端开发工具移动开发创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表