[Twisted] Part 19: I Thought I Wanted It But I Changed My Mind
本文由Dave的 Part 19: I Thought I Wanted It But I Changed My Mind 翻譯而成,你可以由 Part 1 開始閱讀這個系列的文章,也可以在 這裡 找到整個系列的目錄。 Introduction Twisted是一個進行中的專案,Twisted的開發人員會定期的加入新的功能並擴展舊的功能。隨著Twisted 10.1.0的發布,開發人員為Deferred類別加入了一個新的能力-取消(cancellation),我們今天會來探討這個能力。 非同步程式設計將請求從回應中脫離,因而提升了一種新的可能性:在請求結果與取回結果之間,你可能決定你不再需要它了。想一想 Part 14 的詩歌代理伺服器。以下是代理伺服器的運作方式,至少第一次詩歌請求是這樣子: 來了一個詩歌的請求。 代理伺服器聯絡真的伺服器來取得詩歌。 一但詩歌下載完成,將它傳送給原來的用戶端。 這樣看起來都很好,但是如果用戶端在收到詩歌前中止了怎麼辦?也許它們一開始請求 Paradise Lost 的完整文本,後來決定它們真的想要的是 Kojo 的俳句。現在我們的代理伺服器正卡在下載前者,而慢速伺服器還需要一點時間。我們最好關閉這個連接,並且讓慢速伺服器回去睡覺。 回憶一下 圖15 ,那張顯示同步程式控制的概念流程的圖。在那張圖中我們看到函式呼叫是由上而下,而例外是由下而上返回。如果我們想要取消同步函式的呼叫(而這只是假設),流程控制會與函式呼叫的方向相同,像圖38從高層程式碼到底層程式碼: 圖38.有假設性取消的同步程式流程 當然,在同步程式中這是不可能的,因為直到底層程式碼操作完成前,高層程式碼根本不會恢復執行,在這個時間根本沒有東西可以取消。 但是在非同步程式中,高層程式碼在底層程式碼完成前得到控制權,這至少提升了在底層請求完成之前取消它的可能性。 在Twisted程式中,底層請求是由Deferred物件來具體化的,你可以想像它是未完成的非同步操作的「handle」。在deferred實例中訊息的一般流程是向下的,從底層程式碼到高層程式碼,這與同步程式中的回傳訊息流程一致。從Twisted 10.1.0開始,高層程式碼可以向反方向傳送訊息-這樣可以告訴底層程式碼它不在需要底層程式碼的結果了。看看圖39: 圖39.在def...