亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在多個不同的控制臺中輸出goroutines?

如何在多個不同的控制臺中輸出goroutines?

Go
飲歌長嘯 2022-08-30 15:14:09
我正在練習使用goroutines,發現如果兩個goroutine同時打印,則很難閱讀。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......有沒有辦法打開多個控制臺,讓兩個goroutines在不同的控制臺中輸出?
查看完整描述

2 回答

?
30秒到達戰場

TA貢獻1828條經驗 獲得超6個贊

您可以使用一個簡單的TCP終端服務器 - 首先運行此TCP終端服務器,并且不需要根據需要關閉它(或者只需使用Netcat命令:然后轉到#2并寫入此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()

然后在代碼中用作另一個示例,例如,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()

}


查看完整回答
反對 回復 2022-08-30
?
開滿天機

TA貢獻1786條經驗 獲得超13個贊

fmt.Print*(...)函數是 的包裝器。如果你想讓兩個 goroutine 寫給不同的作者,代碼中的第一步是提供他們應該使用的作家: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)

而不是原始的 ,您可能希望傳遞可以記錄的內容;標準庫具有以下結構: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日志記錄庫以獲取更多功能 - 但是,不要花太多時間為快速一次性項目選擇日志記錄框架。


現在您已經有了一個明確的方式將兩個不同的寫入器(或記錄器)傳遞給您的 goroutines,請選擇適合您需要寫入的任何內容:

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

  • 登錄到 和 -- 只需在某個單獨的終端中運行即可獲得輸出的“實時視圖”file1file2tail -f file2

  • io.Discard是一個內置的 golang,相當于/dev/null

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


查看完整回答
反對 回復 2022-08-30
  • 2 回答
  • 0 關注
  • 69 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號