【async with client】

"""
1. create client
2. get tools, resources, prompts
3. invoke tools

"""
import asyncio

from fastmcp import Client

async def client_fn():
    client = Client('server.py')
    async with client:
        tools = await client.list_tools()
        tool = tools[0]
        tool_result = await client.call_tool(tool.name, {"city": "北京"})
        print(tool_result)

if __name__ == '__main__':
    asyncio.run(client_fn())

在这段代码里,async with client: 这种用法是和异步上下文管理器相关的。下面为你详细介绍:

  1. 异步上下文管理器
    异步上下文管理器是一种支持在其入口和出口点执行异步操作的对象。它和常规的上下文管理器功能类似,不过其 __aenter____aexit__ 方法是可以异步执行的。
async with client:
    # 执行异步操作
    tools = await client.list_tools()
    # 其他代码...
  1. async with 的作用
    借助 async with,我们能够在进入和离开代码块时,分别执行异步初始化和清理操作。就像在这个例子中,client 对象在进入代码块时会进行异步连接操作,而在离开时则会执行异步关闭操作。

  2. 代码中的具体情况
    在提供的代码中,Client 类实现了异步上下文管理器接口,这意味着它至少包含以下两个特殊方法:

class Client:
    async def __aenter__(self):
        # 进行异步初始化,比如连接服务器
        await self.connect()
        return self

    async def __aexit__(self, exc_type, exc, tb):
        # 执行异步清理,例如关闭连接
        await self.close()

所以,async with client: 这行代码会先调用 __aenter__ 方法来建立与服务器的连接,代码块执行完毕后,再调用 __aexit__ 方法关闭连接。

  1. 使用异步上下文管理器的好处
  • 保证资源能够被正确释放,就算代码块中出现异常也不会有问题。
  • 让异步资源管理的代码变得更加简洁,避免了手动调用 connect()close() 方法。

总结一下,async with client: 的作用是管理客户端与服务器连接的生命周期,保证连接在使用完毕后能被正确关闭,是一种既安全又优雅的异步资源管理方式。

posted @ 2025-06-21 13:47  十三山入秋  阅读(37)  评论(0)    收藏  举报