2016年6月20日 星期一

Use context to cancel a function




我曾經使用到一個函數,是要帶入 context.Background。然後這個函數就等在裡面了,直到有回應才回傳結果出來。最近要將這個函數強制的跳出,一時間還不知道該怎麼做。苦惱之際看到了這個函數帶入了 context.Background(),於是就從context這個庫去爬文。於是先找到了


http://studygolang.com/articles/5131


裡面重點的說明了原文裡面 context 的原理與使用方法。原文在這兒:

https://godoc.org/golang.org/x/net/context

還有Google使用context的博客

http://blog.golang.org/context


前情提要講完了,現在直些貼程式碼該怎麼強制跳出一個帶入了context.Background的函數呢?


原本是:

err = aBlockedFunction(context.Background())

想要能夠跳出,就利用WithCancel來生一個cancel函數出來:

ctx,cancel := context.WithCancel( context.Background() )然後放進去
err = aBlockedFunction(ctx)
這樣就能在想要的時機點,呼叫cancel就能夠將旗下的子孫都清除掉,然後從函式返回了。
這也提醒了我,應該來用context來管理資源,這樣子就能夠很容易寫出讓別人cancel的函數了