在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/GO/ 這段協(xié)程怎么不阻塞?

這段協(xié)程怎么不阻塞?

程序片段如下:

runtime.GOMAXPROCS(runtime.NumCPU())
        //maxPage := getMaxPage()
        maxPage := 10
        if maxPage > 0 {
            jobs := make(chan int, maxPage)
            results := make(chan []map[string]string, maxPage)

            // 招聘工人,讓他們工作(待命),每個工人會從jobs管道里獲得任務(wù),工人干活,把結(jié)果放到results管道
            for w := 1; w <= runtime.NumCPU(); w++ {
                go worker(w, jobs, results)
            }
            db, err := mysqlUtil.CreateReadDb()
            if err != nil {
                log.Fatal("connect db err ", err)
                fmt.Println("connect db err ", err)
            }

            //分配任務(wù)
            for j := 1; j <= maxPage; j++ {
                jobs <- j
            }
            close(jobs)
            for data := range results {
                //寫數(shù)據(jù)庫操作
            }
            close(results)
            fmt.Println("all done...")
        }

woker函數(shù)如下:

func worker(id int, jobs <-chan int, results chan<- []map[string]string) {
    for j := range jobs {
        url := host + "/type/1/" + strconv.Itoa(j) + ".html"
        fmt.Println()
        data := getData(url)
        fmt.Printf("worker %d finished job %d", id, j)
        fmt.Println()
        results <- data
    }
}

現(xiàn)在的問題是程序在

for data := range results {
                //寫數(shù)據(jù)庫操作
            }

這一個地方阻塞住了,job都完成了,job完成后的數(shù)據(jù)都放到了result里面,上面也都完成了寫庫操作,為啥阻塞在了那里,不往下執(zhí)行了呢?

回答
編輯回答
拽很帥

range results 這個操作只有在關(guān)閉管道之后,才會繼續(xù)往下執(zhí)行。否則會一直阻塞。

2018年2月9日 21:50
編輯回答
朕略萌
            for j := 1; j <= maxPage; j++ {
                data := <- results
                //寫數(shù)據(jù)庫
                fmt.Println(len(data))
            }
            close(results)

程序有點(diǎn)問題,處理結(jié)果這樣操作就行了,就不會阻塞了。

2018年5月10日 19:50
編輯回答
初心
go func(){
        for data := range results {
            //寫數(shù)據(jù)庫操作
        }
    }()
    

把這個放goruntine即可。另外還要注意控制主進(jìn)程退出的時機(jī),防止goruntine沒處理完主進(jìn)程就退出。
阻塞的原因是results在緩存為空的時候會阻塞除非results被close,你這里主進(jìn)程被阻塞了,一直跑不到close的地方。
2018年7月18日 21:10