Go Context包之cancelCtx實現

2021-10-09 05:46:25 字數 1535 閱讀 2532

涉及的兩個重要基礎知識點:

1. 關閉的channel裡面讀取資料預設永遠有個零值兜底

2. select裡面加上default就不會阻塞

其一:

package main

import "fmt"

func main() }}

//結果(關閉的channel永遠能讀到值)

value 0

value 0

value 0

value 0

value 0

value 0

value 0

......

其二:

package main

import "fmt"

func main()

}}

cancelctx實現:

package realize

import "sync"

//必備知識:

//從開啟的channel讀資料會阻塞,但從關閉的channel裡面讀取資料,依然可以接受到之前已經成功傳送的資料;如果channel中已經沒有資料的話將產生乙個零值的資料,這個零值在關閉的channel裡面是無限的,可以一直讀到

//實現原理

//cancel的實現原理,根節點建立乙個channel,在每個子gorountine中進行channel接收的select監控(注意此處需要有default,不然會造成阻塞系統報錯),

//當關閉channel時,cancnel channel就會因為接收到預設零值而進入select,此時便可以進行關閉等操作。

//1.定義訊號源context

//2.傳遞訊號源並在gorountine監控

//3.訊號源關閉

關閉var closedchan = make(chan struct{})

func init()

type context struct //關閉訊號

}func newcancelcontext() context

}//傳送關閉訊號

func (ctx *context)cancel()else

ctx.mu.unlock()

}//返回channel,懶建立

func (ctx *context)done() <-chan struct{} )

} ctx.mu.unlock()

return ctx.done

}

呼叫案例跟context包的cancelctx呼叫一一致

package main

import (

"exercise/context/realize"

"fmt"

"sync"

"time"

)var wg sync.waitgroup

func main()

func work(ctx realize.context)

} wg.done()

}

包python python之各種包

因為需要解決不同的需求,所以,python準備了豐富的模組.只要匯入就可以使用,簡潔高效.collection模組 具名元組 namedtuple 可以給指定位置傳參,一一賦值後,可以單獨呼叫.可以運用於儲存座標位置 佇列 queue 先進先去 雙端佇列 有序字典 orderdict 記住了字典元素...

白話揹包之完全揹包

藉著前面的白話揹包之01揹包的基礎,來結合圖看看完全揹包是個什麼東東,希望以後自己看能一目了然,能對剛接觸的童鞋有幫助是最好不過滴 一 關於完全揹包 有n個物品,每個物品 有無限多個 i 對應有重量w i 價值va i 有乙個揹包可以放m重的物品,現在讓你從n鐘物品中選擇一些物品,在不超過揹包上限情...

揹包問題之01揹包

01揹包就是說針對每一件物品,有選擇裝入或者放棄,是屬於動態規劃類的問題。現在假設我們有m件物品,各有價值,揹包承重為10,假設當前可用的承重量為v,當前在抉擇第m件物品是否放入,重量為w1,價值為v1,那麼,如果不放入,我們的價值應該保持不變,並與之前算出的最大價值相同,如果放入,放入後的價值就是...