涉及的兩個重要基礎知識點:
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,那麼,如果不放入,我們的價值應該保持不變,並與之前算出的最大價值相同,如果放入,放入後的價值就是...