Middle
Bir nechta gorutinda bir xil []byte buferidan foydalanish mumkinmi?
sobes.tech AI
AIdan javob
Ha, mumkin, ammo buferga kirishni sinxronlashtirishni ta'minlash kerak, shunda raqobat sharoitlari oldi olinadi.
Eng keng tarqalgan yondashuvlar:
-
Miyuteks (
sync.Mutex) :import "sync" var buf []byte var mu sync.Mutex func processBuffer() { mu.Lock() defer mu.Unlock() // Bufga xavfsiz kirish // Masalan: buf = append(buf, data...) } func main() { // bufni boshlash go processBuffer() go processBuffer() // ... } -
Kanal (
chan) :Buffer egasini goroutinelar orasida o'tkazish yoki kirishni muvofiqlashtirish uchun kanal ishlatish mumkin.
import "bytes" type BufferAccess struct { buf *bytes.Buffer // Umumiy foydalanish uchun buffer ko'rsatkichi mu sync.Mutex // Kirishni sinxronlashtirish uchun miyuteks } func (ba *BufferAccess) Write(p []byte) (n int, err error) { ba.mu.Lock() defer ba.mu.Unlock() return ba.buf.Write(p) } func worker(ba *BufferAccess, data []byte) { ba.Write(data) // Miyuteks bilan xavfsiz yozish } func main() { sharedBuffer := &BufferAccess{buf: &bytes.Buffer{}} // Goroutinelarni ishga tushirish, sharedBuffer ni uzatish go worker(sharedBuffer, []byte("hello")) go worker(sharedBuffer, []byte("world")) // ... } -
Bufferlar havzasi (
sync.Pool) :Har bir goroutine bufferni havzadan oladi, foydalanadi va keyin qaytaradi, shuning uchun kirishni sinxronlashtirish kamroq muhim.
import ( "bytes" "sync" ) var bufferPool = sync.Pool{ New: func() interface{} { // Standart buffer o'lchami return bytes.NewBuffer(make([]byte, 0, 1024)) }, } func processData(data []byte) { buf := bufferPool.Get().(*bytes.Buffer) defer bufferPool.Put(buf) // Bufferni havzaga qaytarish muhim buf.Reset() // Foydalanishdan oldin bufferni tozalash buf.Write(data) // Ma'lumotlarni bufferda ishlash // ... } func main() { go processData([]byte("message1")) go processData([]byte("message2")) // ... }
Muhim: Raqobat sharoitida sinxronizatsiya qilinmagan holda bufferdan foydalanish data race'ga olib keladi, bu esa dastur xatti-harakatining oldindan aytib bo'lmaydigan bo'lishiga va qiyin aniqlanadigan xatolarga sabab bo'ladi.