2 回答
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()
}
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 file2io.Discard是一个内置的 golang,相当于/dev/null登录到命名管道,unix套接字,tcp连接...
- 2 回答
- 0 关注
- 159 浏览
添加回答
举报
