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

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

如何在多個(gè)不同的控制臺(tái)中輸出goroutines?

如何在多個(gè)不同的控制臺(tái)中輸出goroutines?

Go
飲歌長(zhǎng)嘯 2022-08-30 15:14:09
我正在練習(xí)使用goroutines,發(fā)現(xiàn)如果兩個(gè)goroutine同時(shí)打印,則很難閱讀。func main() {    s1 := rand.NewSource(time.Now().UnixNano())    r1 := rand.New(s1)    wg := &sync.WaitGroup{}    t1 := func(wg *sync.WaitGroup) {        for i := 0; i < 100; i++ {            time.Sleep(time.Microsecond * time.Duration(r1.Intn(100)))            fmt.Println("T1 : ", i)        }        wg.Done()    }    t2 := func(wg *sync.WaitGroup) {        for i := 0; i < 100; i++ {            time.Sleep(time.Microsecond * time.Duration(r1.Intn(100)))            fmt.Println("T2 : ", i)        }        wg.Done()    }    wg.Add(2)    go t1(wg)    go t2(wg)    wg.Wait()}輸出:T1 :  0T2 :  0T2 :  1T1 :  1T1 :  2T2 :  2T1 :  3T2 :  3T1 :  4T2 :  4T1 :  5T2 :  5T1 :  6T2 :  6T2 :  7T1 :  7T2 :  8T1 :  8T1 :  9T2 :  9T2 :  10T1 :  10......有沒(méi)有辦法打開(kāi)多個(gè)控制臺(tái),讓兩個(gè)goroutines在不同的控制臺(tái)中輸出?
查看完整描述

2 回答

?
30秒到達(dá)戰(zhàn)場(chǎng)

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

您可以使用一個(gè)簡(jiǎn)單的TCP終端服務(wù)器 - 首先運(yùn)行此TCP終端服務(wù)器,并且不需要根據(jù)需要關(guān)閉它(或者只需使用Netcat命令:然后轉(zhuǎn)到#2并寫(xiě)入此TCP連接,例如“127.0.0.1:8080”):nc -l 8080

package main


import (

    "io"

    "log"

    "net"

    "os"

)


func main() {

    ln, err := net.Listen("tcp", "127.0.0.1:8080")

    if err != nil {

        log.Fatal(err)

    }

    for {

        w1, err := ln.Accept()

        if err != nil {

            log.Fatal(err)

        }

        io.Copy(os.Stdout, w1)

        w1.Close()

    }

}

然后將其添加到您的代碼中:

    w1, err := net.Dial("tcp", "127.0.0.1:8080")

    if err != nil {

        log.Fatal(err)

    }

    defer w1.Close()

然后在代碼中用作另一個(gè)示例,例如,w1io.Writerfmt.Fprintln(w1, "T1 : ", i)

package main


import (

    "fmt"

    "log"

    "math/rand"

    "net"

    "sync"

    "time"

)


func main() {

    w1, err := net.Dial("tcp", "127.0.0.1:8080")

    if err != nil {

        log.Fatal(err)

    }

    defer w1.Close()


    // your code:

    s1 := rand.NewSource(time.Now().UnixNano())

    r1 := rand.New(s1)

    wg := &sync.WaitGroup{}

    t1 := func(wg *sync.WaitGroup) {

        for i := 0; i < 100; i++ {

            time.Sleep(time.Microsecond * time.Duration(r1.Intn(100)))

            fmt.Fprintln(w1, "T1 : ", i)

        }

        wg.Done()

    }

    t2 := func(wg *sync.WaitGroup) {

        for i := 0; i < 100; i++ {

            time.Sleep(time.Microsecond * time.Duration(r1.Intn(100)))

            fmt.Println("T2 : ", i)

        }

        wg.Done()

    }

    wg.Add(2)

    go t1(wg)

    go t2(wg)

    wg.Wait()

}


查看完整回答
反對(duì) 回復(fù) 2022-08-30
?
開(kāi)滿天機(jī)

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

fmt.Print*(...)函數(shù)是 的包裝器。如果你想讓兩個(gè) goroutine 寫(xiě)給不同的作者,代碼中的第一步是提供他們應(yīng)該使用的作家:fmt.Fprint*(os.Stdout, ...)


    t1 := func(wg *sync.WaitGroup, out io.Writer) {

        for i := 0; i < 100; i++ {

            time.Sleep(time.Microsecond * time.Duration(r1.Intn(100)))

            fmt.Fprintln(out, "T1 : ", i)

        }

        wg.Done()

    }


    ...


    // for starters : keep using the same os.Stdout writer

    go t1(wg, os.Stdout)

而不是原始的 ,您可能希望傳遞可以記錄的內(nèi)容;標(biāo)準(zhǔn)庫(kù)具有以下結(jié)構(gòu):io.Writerlog.Logger


    t1 := func(wg *sync.WaitGroup, l *log.Logger) {

        for i := 0; i < 100; i++ {

            time.Sleep(time.Microsecond * time.Duration(r1.Intn(100)))

            l.Println(i)

        }

        wg.Done()

    }


    ...


    // all logging libraries will allow you to specify some option which you can tune :

    l1 := log.New(os.Stdout, "T1 : ", log.Ltime) // will prefix all messages with "[time] T1 : "

    go t1(wg, l1)


    // this allows you to write :

    l2 := log.New(os.Stdout, "T2 : ", log.Ltime) // will prefix all messages with "[time] T2 : "

    go t2(wg, l2)

你可以查看golang日志記錄庫(kù)以獲取更多功能 - 但是,不要花太多時(shí)間為快速一次性項(xiàng)目選擇日志記錄框架。


現(xiàn)在您已經(jīng)有了一個(gè)明確的方式將兩個(gè)不同的寫(xiě)入器(或記錄器)傳遞給您的 goroutines,請(qǐng)選擇適合您需要寫(xiě)入的任何內(nèi)容:

  • 有 goroutine 1 log 到 Stdout,goroutine 2 log 到 Stderr

  • 登錄到 和 -- 只需在某個(gè)單獨(dú)的終端中運(yùn)行即可獲得輸出的“實(shí)時(shí)視圖”file1file2tail -f file2

  • io.Discard是一個(gè)內(nèi)置的 golang,相當(dāng)于/dev/null

  • 登錄到命名管道,unix套接字,tcp連接...


查看完整回答
反對(duì) 回復(fù) 2022-08-30
  • 2 回答
  • 0 關(guān)注
  • 73 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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