iT邦幫忙

2025 iThome 鐵人賽

DAY 10
0
Software Development

MCP的30天養成計畫系列 第 10

【Day 10】FastMCP Tool的建構方式(一)

  • 分享至 

  • xImage
  •  

Python def vs async def

正是製做Tool前先來了解一下常見的兩個函數定義方法,分別是 defasync def ,這兩個到底哪裡不一樣呢?

def (同步)

def 關鍵字用於定義一個常規函式,當呼叫常規函式時,程式的執行會被阻塞,直到函式返回。

範例

import time

def say_hello(name: str):
  print(f"準備向 {name} 問好...")
  time.sleep(2)  # 模擬一個阻塞的 I/O 操作
  print(f"你好, {name}!")

say_hello("世界")
say_hello("使用者")

執行流程

  1. 呼叫 say_hello("世界")
  2. 程式輸出「準備向 世界 問好...」。
  3. 程式等待 2 秒。
  4. 程式輸出「你好, 世界!」。
  5. 呼叫 say_hello("使用者")
  6. 程式輸出「準備向 使用者 問好...」。
  7. 程式等待 2 秒。
  8. 程式輸出「你好, 使用者!」。

總執行時間約為 4 秒。

async def (非同步)

async def 關鍵字用於定義一個協程,這是一種可以暫停和恢復的特殊函式。

協程用於非同步程式設計,允許程式在等待操作完成時執行其他任務。

非同步的優點

  • 效能: 對於 I/O 密集型任務(例如:網路請求、檔案讀寫),非同步程式碼可以顯著提高效能。當一個任務在等待 I/O 操作完成時,程式可以切換到執行其他任務,而不是空閒等待。
  • 並發性: 非同步程式碼可以輕鬆地處理數千個並發連接,而不會為每個連接創建一個新的執行緒。這使得它非常適合開發高效能的網路應用程式。
  • 響應性: 在圖形化使用者介面 (GUI) 應用程式中,非同步程式碼可以防止介面在執行長時間運行的任務時被凍結。

範例

import asyncio

async def say_hello(name: str):
  print(f"準備向 {name} 問好...")
  await asyncio.sleep(2)  # 非阻塞的睡眠
  print(f"你好, {name}!")

async def main():
  await asyncio.gather(
    say_hello("世界"),
    say_hello("使用者")
  )

asyncio.run(main())

執行流程

  1. asyncio.run(main()) 啟動事件循環。
  2. main() 呼叫 asyncio.gather() 並傳入兩個 say_hello 協程。
  3. 呼叫 say_hello("世界")
  4. 程式輸出「準備向 世界 問好...」。
  5. await asyncio.sleep(2) 暫停協程,並允許事件循環執行其他任務。
  6. 呼叫 say_hello("使用者")
  7. 程式輸出「準備向 使用者 問好...」。
  8. await asyncio.sleep(2) 也暫停這個協程。
  9. 事件循環等待兩個 asyncio.sleep() 呼叫完成。
  10. 2 秒後,第一個 say_hello 協程恢復並輸出「你好, 世界!」。
  11. 第二個 say_hello 協程恢復並輸出「你好, 使用者!」。

總執行時間約為 2 秒,因為兩個 say_hello 協程是並發執行的。

總結

功能 def async def
類型 常規函式 協程
執行 同步 非同步
阻塞 否 (與 await 一起使用時)
使用場景 通用函式 I/O 密集型和高階結構化網路程式碼

上一篇
【Day 09】先緩一下! 質疑MCP、理解MCP、實踐MCP!
下一篇
【Day 11】FastMCP Tool的建構方式(二)
系列文
MCP的30天養成計畫14
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言