第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

從文件中解析數(shù)據(jù)時(shí)大小不同的地圖的地圖

從文件中解析數(shù)據(jù)時(shí)大小不同的地圖的地圖

Go
翻閱古今 2023-07-10 10:44:27
我正在為 Nagios 構(gòu)建一個(gè) API 。我開始重新創(chuàng)建讀取 status.dat 文件并將數(shù)據(jù)存儲(chǔ)在多個(gè)對(duì)象中的代碼,然后使用這些對(duì)象創(chuàng)建在 core.py 文件中找到的主機(jī)、服務(wù)、信息字典。下面是我的 Go 版本的 python 代碼,它似乎按預(yù)期工作。它仍處于早期階段,因此我對(duì)任何編碼不當(dāng)做法表示歉意。
查看完整描述

3 回答

?
萬千封印

TA貢獻(xiàn)1891條經(jīng)驗(yàn) 獲得超3個(gè)贊

var mu = &sync.RWMutex{}


func openStatusFile() *os.File {

    file, err := os.Open("/usr/local/nagios/var/status.dat")

    if err != nil {

    }

    return file

}


func nextStanza() <-chan map[string]string {


    myChannel := make(chan map[string]string)


    scanner := bufio.NewScanner(openStatusFile())


    current := make(map[string]string)


    go func() {

        for scanner.Scan() {

            mainline := scanner.Text()

            line := strings.TrimSpace(mainline)

            if strings.HasSuffix(line, "{") {

                if len(current) != 0 {

                    myChannel <- current

                }

                result := strings.SplitN(line, " ", 2)

                mu.Lock()

                current["type"] = result[0]

                mu.Unlock()

            } else if strings.Contains(line, "=") {

                result := strings.SplitN(line, "=", 2)

                key := result[0]

                val := result[1]

                mu.Lock()

                current[key] = val

                mu.Unlock()

            }

        }

        close(myChannel)

    }()

    return myChannel

}

在主函數(shù)中,我創(chuàng)建了嵌套映射以暫時(shí)僅保存主機(jī)數(shù)據(jù),并且完成后沒有任何抱怨。我遇到的問題是,當(dāng)我檢查此映射的長度時(shí),我期望看到 104 個(gè)主機(jī),但每次運(yùn)行此測(cè)試文件時(shí)都會(huì)得到不同的結(jié)果。


func main() {


    hoststatus := nextStanza()


    hosts := make(map[string]map[string]string)

    // services := make(map[string]map[string]map[string]string)

    var host string

    // var service string


    for obj := range hoststatus {

        var hostPlaceHolder string

        var typePlaceHolder string


        mu.Lock()

        hostPlaceHolder = obj["host_name"]

        mu.Unlock()


        if hostPlaceHolder != "" {

            host = hostPlaceHolder

        }


        mu.Lock()

        typePlaceHolder = obj["type"]

        mu.Unlock()


        if typePlaceHolder == "hoststatus" {

            mu.Lock()

            hosts[host] = obj

            mu.Unlock()

        }

    }

    fmt.Println(len(hosts))

}

第一次運(yùn)行:


$ go run -race mytest.go

93

第二次運(yùn)行:


$ go run -race mytest.go

95

第三次運(yùn)行:


$ go run -race mytest.go

63

你明白了。


我覺得問題與地圖有關(guān),因?yàn)槿绻抑皇谴蛴≈鳈C(jī)而不將它們放入地圖中,我會(huì)看到我期望的所有主機(jī)。每次運(yùn)行時(shí)地圖尺寸不同的原因是什么?


查看完整回答
反對(duì) 回復(fù) 2023-07-10
?
慕無忌1623718

TA貢獻(xiàn)1744條經(jīng)驗(yàn) 獲得超4個(gè)贊

我能夠通過在將地圖current發(fā)送到頻道后清空地圖來解決我的問題。


myChannel <- current

current = make(map[string]string)

然后在循環(huán)main()后的函數(shù)中for obj := range hoststatus,我將這些數(shù)據(jù)放入一個(gè)單獨(dú)的映射中,然后進(jìn)行處理。


hostStatusMap := make(map[string]string)

    for k, v := range obj {

        hostStatusMap[k] = v

    }

我還能夠刪除分散在代碼中的鎖,現(xiàn)在它在每次運(yùn)行時(shí)返回正確的主機(jī)長度。


查看完整回答
反對(duì) 回復(fù) 2023-07-10
?
holdtom

TA貢獻(xiàn)1805條經(jīng)驗(yàn) 獲得超10個(gè)贊

您的代碼具有以下競(jìng)爭(zhēng)條件


func nextStanza() <-chan map[string]string {


    myChannel := make(chan map[string]string)


    scanner := bufio.NewScanner(openStatusFile())


    current := make(map[string]string)


    go func() {

        for scanner.Scan() {

            mainline := scanner.Text()

            line := strings.TrimSpace(mainline)

            if strings.HasSuffix(line, "{") {

                if len(current) != 0 {

                    myChannel <- current

                }

                result := strings.SplitN(line, " ", 2)

                mu.Lock()

                current["type"] = result[0]

                mu.Unlock()

            } else if strings.Contains(line, "=") {

                result := strings.SplitN(line, "=", 2)

                key := result[0]

                val := result[1]

                mu.Lock()

                current[key] = val

                mu.Unlock()

            }

        }

        close(myChannel)

    }()

    return myChannel

}

當(dāng)您在匿名函數(shù)上啟動(dòng) goroutine 時(shí),您并沒有為其創(chuàng)建 WaitGroup。這意味著該函數(shù)nextStanza()將啟動(dòng) goroutine,而return無需等待匿名 goroutine 終止——從而在父函數(shù)關(guān)閉時(shí)結(jié)束 goroutine。


我建議使用等待組,這樣可以保證匿名函數(shù)終止。


一個(gè)簡(jiǎn)單的例子說明了正在發(fā)生的事情:


具有競(jìng)爭(zhēng)條件


import (

    "fmt"

    "time"

    // "sync"

    )


func main() {

    go func() {

        time.Sleep(3 * time.Second)

        fmt.Println("hai")

    }()

    return

}

沒有競(jìng)爭(zhēng)條件


import (

    "fmt"

    "time"

    "sync"

    )


func main() {

    var wg sync.WaitGroup

    wg.Add(1)

    go func() {

        time.Sleep(3 * time.Second)

        fmt.Println("hai")

        wg.Done()

    }()

    wg.Wait()

    return

}


查看完整回答
反對(duì) 回復(fù) 2023-07-10
  • 3 回答
  • 0 關(guān)注
  • 189 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)