溫馨提示×

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
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女