同時プログラミングの例

3006 ワード

golangのtimerを使う
タイミングタスク
func demo(input chan interface{}) {
    t1 := time.NewTimer(time.Second * 5)
    t2 := time.NewTimer(time.Second * 10)

    for {
        select {
        case msg 

だんぞくき
func main(){
    ticker := time.NewTicker(time.Second)
    for t := range ticker.C {
        fmt.Println("ticker", t)
    }
}

タイムアウト
func main(){
    ch1 := make(chan int, 1)
    ch2 := make(chan int, 1)

    select {
        case e1 := 

カスタムタイマ
func main(){
    var t *time.Timer

    f := func(){
        fmt.Printf("Expiration time : %v.
", time.Now()) fmt.Printf("C`s len: %d
", len(t.C)) } t = time.AfterFunc(1*time.Second, f) // Goroutine 2s, // ,time.AfterFunc 。 f。 time.Sleep(2 * time.Second) }

時間制御によるticker停止
func main(){
    //      ,  2s
    var ticker *time.Ticker = time.NewTicker(1 * time.Second)

    go func() {
        for t := range ticker.C {
            fmt.Println("Tick at", t)
        }
    }()

    time.Sleep(time.Second * 5)   //  ,      sleep     /ticker   
    ticker.Stop()       //  ticker
    fmt.Println("Ticker stopped")
}

フォルダのすべてのファイルの長さを同時に読み込む(チャネルを使用)
func test1() {
    //      ,     
    dir := "./db"
    paths, err := ioutil.ReadDir(dir)
    check(err)
    var files []string
    for _, path := range paths {
        if !path.IsDir() {
            files = append(files, path.Name())
        }
    }

    type FileInfo struct {
        FileName string
        Len      int
        Err      error
    }
    way := make(chan FileInfo, 100)
    for _, file := range files {
        go func(fileName string) {
            content, err := ioutil.ReadFile(fmt.Sprintf("%s/%s", dir, fileName))
            //     ,        
            way 

フォルダのすべてのファイルを同時に読み込む(sync.WaitGroupを使用)
これを使うのは実はカウンターの理屈です
func test1() {
    dir := "./db"
    paths, err := ioutil.ReadDir(dir)
    check(err)
    var files []string
    for _, path := range paths {
        if !path.IsDir() {
            files = append(files, path.Name())
        }
    }

    // sizes              goroutine  
    sizes := make(chan int64)
    //    
    var wg sync.WaitGroup
    for _, file := range files {
        wg.Add(1)
        go func(fileName string) {
            defer wg.Done()
            fileInfo, _ := os.Stat(fmt.Sprintf("%s/%s", dir, fileName))
            sizes 

トークン-別の信号カウンタ
func check(err error) {
    if err != nil {
        panic(err)
    }
}

func main() {
    //     
    workList := make(chan []string)
    //          ,  map     
    seen := make(map[string]bool)
    // n          
    n := 1
    //     
    go func() { workList  0; i++ {
        list := 

個人ブログ:http://blog.xbug.site