MCP Academy · บทเรียน

จัดการคำขอยกเลิก

หยุดงานอย่างเรียบร้อยเมื่อไคลเอ็นต์ยกเลิก

บทเรียน 2 จาก 413 ขั้นตอน

จัดการคำขอยกเลิก เป็นบทเรียน MCP Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน MCP Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส MCP Academy มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดจึงมีการยกเลิก

ผู้ใช้อาจปิดแชตหรือเปลี่ยนใจขณะที่เครื่องมือระยะยาวกำลังทำงาน MCP ช่วยให้ไคลเอ็นต์ส่งการยกเลิกเพื่อหยุดงานที่ไม่จำเป็น

การแจ้งเตือนการยกเลิก

ไคลเอ็นต์ส่งสัญญาณนี้ด้วยข้อความnotifications/cancelledซึ่งระบุ requestId ที่ต้องการหยุด การส่งนี้เป็นแบบส่งแล้วจบโดยไม่รอคำตอบ

{"method": "notifications/cancelled",
 "params": {"requestId": 7, "reason": "user aborted"}}

นี่เป็นเพียงคำขอหนึ่งรายการ

เฉพาะคำขอที่กำลังดำเนินอยู่เท่านั้นที่ยกเลิกได้ โดยจับคู่ผ่านrequestId ส่วนการแจ้งเตือนซึ่งไม่มีรหัส จะไม่สามารถยกเลิกได้

การยกเลิกเป็นความพยายามอย่างดีที่สุด

การยกเลิกเป็นคำขออย่างสุภาพ ไม่ใช่การบังคับหยุด งานของคุณอาจใกล้เสร็จอยู่แล้ว จึงควรถือว่าการยกเลิกเป็นสัญญาณตามความเหมาะสมให้ค่อย ๆ หยุดทำงาน

asyncio จัดการการเชื่อมต่อให้

ใน Python SDK การยกเลิกจะมาถึงในรูปของ asyncio.CancelledError ที่ถูกส่งภายในเครื่องมือซึ่งกำลังรอผล โดยทั่วไปคุณไม่ต้องตรวจสอบเครื่องหมายด้วยตนเอง

import asyncio
# CancelledError is raised at the next await point

ปล่อยให้ส่งต่อขึ้นไป

พฤติกรรมที่ถูกต้องและง่ายที่สุดคือปล่อยให้ CancelledError แพร่ขึ้นไป เฟรมเวิร์กจะหยุดงานและข้ามการส่งผลลัพธ์ปกติ

@mcp.tool()
async def crunch(ctx: Context) -> str:
    for item in items:
        await heavy(item)  # cancel lands here

ล้างทรัพยากรเมื่อยกเลิก

หากเครื่องมือของคุณถือไฟล์หรือล็อกอยู่ ให้ครอบการทำงานเพื่อให้การยกเลิกยังปล่อยทรัพยากรได้ โครงสร้างtry/finallyรับประกันว่าการล้างทรัพยากรจะทำงานระหว่างออกจากส่วนนี้

try:
    await do_work()
finally:
    handle.close()

อย่ากลืนข้อผิดพลาดนี้

อย่าดักจับ CancelledError แล้วทำงานต่อไปอย่างเงียบ ๆ เพราะจะทำให้จุดประสงค์ทั้งหมดของการยกเลิกสูญเปล่า และทำให้ไคลเอ็นต์เข้าใจว่างานถูกหยุดแล้ว

# Anti-pattern:
# except asyncio.CancelledError:
#     pass  # do NOT do this

ไม่มีการตอบกลับหลังยกเลิก

เมื่อคำขอถูกยกเลิกแล้ว อย่าส่งผลลัพธ์หรือข้อผิดพลาดสำหรับคำขอนั้น ไคลเอ็นต์ไปทำงานต่อแล้ว และจะเพิกเฉยต่อ การตอบกลับ ที่มาล่าช้า

คืนทรัพยากรที่กันไว้

การเคารพการยกเลิกอย่างรวดเร็วช่วยคืนทรัพยากร CPU เครือข่าย และโทเค็นของโมเดล เซิร์ฟเวอร์ที่หยุดได้ทันทีถือเป็น ผู้ใช้งานที่มีความรับผิดชอบ ในระบบเอเจนต์ที่มีงานหนาแน่น

ตรวจสอบตามจุดธรรมชาติ

สำหรับลูปที่ใช้ CPU หนักและไม่มี await ให้แทรก await asyncio.sleep(0) สั้น ๆ เพื่อเปิดโอกาสให้การยกเลิกเกิดขึ้นระหว่างแต่ละรอบ

for chunk in chunks:
    crunch(chunk)
    await asyncio.sleep(0)

ตรวจสอบอย่างรวดเร็ว

ตรวจสอบว่าการยกเลิกปรากฏขึ้นในเครื่องมือ MCP ของ Python อย่างไร

สรุป: การยกเลิก

คุณได้เห็นการแจ้งเตือน ที่ถูกยกเลิก ได้เรียนรู้ว่าเหตุใดการยกเลิกจึงทำได้เพียงแบบพยายามอย่างดีที่สุด และวิธีปล่อยให้ CancelledError แพร่ต่อไปพร้อมทำความสะอาดทรัพยากร ทำได้ดีมากครับ/ค่ะ!

เริ่มต้นได้ฟรี

เรียนรู้ Python ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
30
บทเรียน
120

คำถามที่พบบ่อย

บทเรียน “จัดการคำขอยกเลิก” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “จัดการคำขอยกเลิก” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส MCP Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส MCP Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “จัดการคำขอยกเลิก”

หยุดงานอย่างเรียบร้อยเมื่อไคลเอ็นต์ยกเลิก คุณปฏิบัติ MCP Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน MCP Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน MCP Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “จัดการคำขอยกเลิก” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน MCP Academy นี้ได้ไหม

ได้ บทเรียน MCP Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ส่งความคืบหน้าสำหรับงานที่ใช้เวลานาน
  2. จัดการคำขอยกเลิก
  3. การบันทึกแบบมีโครงสร้างไปยังไคลเอ็นต์
  4. ตั้งระดับบันทึกขณะทำงาน
← กลับไปที่ MCP Academy