linux

Golang日志中如何实现多线程安全

小樊
58
2025-04-14 10:25:14
栏目: 编程语言

在Golang中,可以使用标准库"sync"中的sync.Mutex来实现多线程安全的日志记录。以下是一个简单的示例:

package main

import (
	"fmt"
	"log"
	"os"
	"sync"
	"time"
)

type Logger struct {
	mu    sync.Mutex
	logger *log.Logger
}

func NewLogger(prefix string) *Logger {
	return &Logger{
		logger: log.New(os.Stdout, prefix, log.LstdFlags),
	}
}

func (l *Logger) Log(msg string) {
	l.mu.Lock()
	defer l.mu.Unlock()
	l.logger.Println(msg)
}

func main() {
	logger := NewLogger("INFO: ")

	var wg sync.WaitGroup
	wg.Add(2)

	go func() {
		defer wg.Done()
		for i := 0; i < 5; i++ {
			logger.Log("Thread 1: Log entry " + fmt.Sprintf("%d", i))
			time.Sleep(1 * time.Second)
		}
	}()

	go func() {
		defer wg.Done()
		for i := 0; i < 5; i++ {
			logger.Log("Thread 2: Log entry " + fmt.Sprintf("%d", i))
			time.Sleep(1 * time.Second)
		}
	}()

	wg.Wait()
}

在这个示例中,我们创建了一个名为Logger的结构体,它包含一个sync.Mutex和一个log.Logger。我们为Logger结构体定义了一个Log方法,该方法在记录日志之前锁定互斥锁,并在完成后解锁。这样可以确保在多个线程中同时调用Log方法时,日志记录是线程安全的。

main函数中,我们创建了一个Logger实例,并启动了两个goroutine,每个goroutine都会记录5条日志。由于我们在Log方法中使用了互斥锁,因此这两个goroutine可以安全地同时记录日志,而不会出现竞争条件。

0
看了该问题的人还看了