İptal
Makine çevirisi
Bu sayfa İngilizce dokümantasyondan otomatik olarak çevrildi; esas alınması gereken sürüm İngilizce sayfadır. Yanlış görünen bir şey varsa, nasıl bildireceğinizi Çeviriler sayfası açıklar.
İstemci bir çağrıdan vazgeçebilir: kullanıcı durdur düğmesine basmıştır ya da zaman aşımı süresi dolmuştur.
Bu olduğunda SDK işleyicinizi iptal eder. İşleyicinin beklediği await istisna fırlatır, fonksiyon geri sarılır ve döndürdüğü hiçbir şey gönderilmez. Çoğu işleyicinin bu konuda bir şey yapması gerekmez.
İki tür işleyicinin ise gerekir: temizlemesi gereken bir şey olan işleyici ve düz bir def olan işleyici.
async def araçta temizlik yapma
Temizliği bir finally bloğuna koyun:
import anyio
from mcp.server import MCPServer
mcp = MCPServer("Bookshop")
holds: set[str] = set()
async def take_payment(title: str) -> None:
await anyio.sleep(30) # the customer is typing a card number
async def release_hold(title: str) -> None:
await anyio.sleep(0.1) # a round trip to the stock system
holds.discard(title)
@mcp.tool()
async def order_book(title: str) -> str:
"""Hold a copy of a book while the customer pays for it."""
holds.add(title)
try:
await take_payment(title)
return f"Ordered {title!r}."
finally:
with anyio.move_on_after(5, shield=True):
await release_hold(title)
finally, araç nasıl biterse bitsin çalışır: değer döndürmüş, istisna fırlatmış ya da iptal edilmiş olabilir.awaitkullanmak zorunda olan temizlik içinshield=Truegerekir. İptal edilmiş bir işleyicide sonraki herawaitde istisna fırlatır; bu yüzden koruma olmadanrelease_holdilk satırında dururdu.- Korumalı bir bloğu hiçbir şey iptal edemez, bu yüzden ona bir süre sınırı verin. Burada bu sınır
5saniye.
Tip
except değil, finally kullanın. Temizliğiniz bittikten sonra iptalin yukarı doğru ilerlemeye
devam etmesi gerekir; finally buna izin verir.
Düz def araçta erken durma
Düz bir def araç bir iş parçacığında çalışır ve bir iş parçacığını dışarıdan hiçbir şey kesemez. Aracın kendisinin sorması gerekir:
import time
import anyio.from_thread
from mcp.server import MCPServer
mcp = MCPServer("Bookshop")
offline: set[str] = set()
def index_book(title: str) -> None:
time.sleep(1) # slow work with nothing to await
@mcp.tool()
def rebuild_index(titles: list[str]) -> str:
"""Take search offline and rebuild its index, one book at a time."""
offline.add("search")
try:
for title in titles:
anyio.from_thread.check_cancelled()
index_book(title)
return f"Indexed {len(titles)} books."
finally:
offline.discard("search")
anyio.from_thread.check_cancelled(), çağrı sürerken hiçbir şey yapmaz; çağrı iptal edildikten sonra ise istisna fırlatır. Onu iş birimleri arasında çağırın.- Temizlik burada da bir
finallybloğuna girer. İş parçacığında hiçbir şey await kullanmaz, bu yüzden korumaya gerek yok. - Hiç sormayan bir
defaraç sonuna kadar çalışır ve sonucu atılır.
Geçerli olduğu yerler
Prompt ve kaynak fonksiyonları tam olarak araçlar gibi iptal edilir.
İptal, stdio ve Streamable HTTP üzerinde aynı şekilde çalışır. Bu SDK'nın Client'ında vazgeçmek, call_tool'u bekleyen görevi iptal etmek ya da read_timeout_seconds süresinin dolmasına izin vermek demektir.
Warning
İki Streamable HTTP seçeneği bu haberi işleyicinize ulaştırmaz: 2026-07-28 bağlantısında
json_response=True ve eski nesil bağlantıda stateless_http=True. Bu durumlarda işleyici,
istemci ne yapmış olursa olsun sonuna kadar çalışır.
Özet
- İstemci bir çağrıdan vazgeçtiğinde SDK işleyiciyi iptal eder: araç, prompt ya da kaynak.
async def: temizliği birfinallybloğunda yapın, await kullanan temizliği deanyio.move_on_after(seconds, shield=True)içine koyun.- Düz
def: iş birimleri arasındaanyio.from_thread.check_cancelled()fonksiyonunu çağırın, yoksa araç sonuna kadar çalışır. Temizlik için düz birfinallyyeter. json_response=True(modern bağlantılar) vestateless_http=True(eski nesil bağlantılar) iptali devre dışı bırakır.
İlerleme ve iptal, çalışan bir araç ile onu çağıran arasındadır. Aracın sizin için, yani sunucuyu işleten kişi için log'a yazdığı satırlar ise ayrı bir kanaldır: Log kaydı.