为了账号安全,请及时绑定邮箱和手机立即绑定

如何在多个不同的控制台中输出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 关注
  • 159 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号