Junior — Middle
Чӣ тавр муайян кардани ҳадди аксарии goroutineҳои дар як вақт дар забони Go?
sobes.tech AI
Ҷавоб аз AI
ในภาษา Go ไม่มีเครื่องมือในตัวสำหรับการจำกัดจำนวน goroutines ที่ทำงานพร้อมกันโดยตรง อย่างไรก็ตาม โดยทั่วไปจะใช้ semaphore หรือช่องสัญญาณที่มีความจุจำกัดเพื่อควบคุมขีดจำกัดของการทำงานพร้อมกัน
ตัวอย่างการจำกัดจำนวน goroutines ที่ทำงานพร้อมกันโดยใช้ช่องสัญญาณ:
package main
import (
"fmt"
"sync"
"time"
)
func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
defer wg.Done()
sem <- struct{}{} // จองช่องว่าง
fmt.Printf("Goroutine %d เริ่มทำงาน\n", id)
time.Sleep(time.Second) // จำลองการทำงาน
fmt.Printf("Goroutine %d ทำงานเสร็จ\n", id)
<-sem // ปล่อยช่องว่าง
}
func main() {
const maxGoroutines = 3
sem := make(chan struct{}, maxGoroutines) // ช่องสัญญาณที่มีบัฟเฟอร์จำกัดจำนวน goroutines
var wg sync.WaitGroup
for i := 1; i <= 10; i++ {
wg.Add(1)
go worker(i, sem, &wg)
}
wg.Wait()
}
ในตัวอย่างนี้ ช่อง sem ที่มีบัฟเฟอร์ maxGoroutines จะจำกัดจำนวน goroutines ที่ทำงานพร้อมกัน แต่ละ goroutineจะวางโครงสร้างว่างในช่องก่อนเริ่มทำงานและปล่อยเมื่อเสร็จสิ้น วิธีนี้จะทำให้มี goroutines ทำงานพร้อมกันไม่เกิน maxGoroutines เท่านั้น.