بیاید مثال داخل تصویر رو بررسی کنیم.
اینجا فرستنده منتظر گیرنده نمیمونه، ولی اگه تعداد دادهها بیشتر از ظرفیت بافر بشه چی؟ آیا باید اندازه بافر رو زیاد کنیم یا ی استراتژی دیگه به کار ببریم؟
#گولنگ #گو #بهینهسازی_کد #Go
Please open Telegram to view this post
VIEW IN TELEGRAM
Anophel | آنوفل
💠چندتا گیرنده همزمان (Worker Pool)
وقتی کار زیاده، چرا یه گیرنده داشته باشیم؟ میتونیم چند گوروتین گیرنده راه بندازیم تا موازی کار کنن. مثلاً:
stream := make(chan int, 5)
go func() {
for i := 1; i <= 10; i++ { fmt.Println("فرستنده:", i)
stream <- i }
close(stream) // کانال بسته میشه}()
for i := 0; i < 3; i++ { go func(id int) {
for data := range stream { fmt.Printf("گیرنده %d: داده %d پردازش شد\n", id, data)
} }(i)
}
با این روش چند تا گوروتین دادهها رو به صورت همزمان میگیرن و پردازش میکنن.
💠کنترل فشار لحظهای (Backpressure)
اگه نمیخوایم سیستم پر بشه و فرستنده هی داده بریزه، کانالهای بدون بافر میتونن کمک کنن. فرستنده منتظر میمونه و فشار کنترل میشه.
💠محدود کردن نرخ ارسال (Rate Limiter)
وقتی گیرندهها نمیتونن سریع پردازش کنن، میتونیم سرعت فرستنده رو محدود کنیم. با استفاده از time.Ticker خیلی راحت میشه این کارو انجام داد:
rateLimiter := time.Tick(100 * time.Millisecond)
go func() { for i := 1; i <= 10; i++ {
<-rateLimiter fmt.Println("فرستنده:", i)
stream <- i }
close(stream)}()
💠صفهای پیشرفته (Priority Queue)
اگه اولویتبندی مهمه، میتونیم از صفهای اولویتدار استفاده کنیم.
⭐️آخرش چی؟
همه چی به نیاز پروژه بستگی داره:
اگه بار بالاست و توزیع شده، از worker pool استفاده کن.
اگه نمیخوای سیستم منفجر بشه، کانالهای بدون بافر و محدود کردن نرخ ارسال جواب میده.
برای نیازهای خاص مثل اولویتبندی، ابزارهای پیشرفتهتر لازم داری.
#گولنگ #گو
#بهینهسازی_کد #go #Golang@anophel
Please open Telegram to view this post
VIEW IN TELEGRAM