Anophel | آنوفل
149 subscribers
278 photos
294 links
آنوفل | Anophel: دنیای بی ‌پایان امکانات برای برنامه‌ نویسان

https://anophel.com

پشتیبانی :
@anophel_support
Download Telegram
💢آیا تا حالا براتون پیش اومده تو کدهای Go، فرستنده ی داده منتظر بمونه تا گیرنده آماده بشه؟

⭐️حالا اگه تعداد گوروتین‌ها زیاد باشه، این انتظار ممکنه به یه گلوگاه توی برنامه تبدیل بشه. ولی آیا همیشه باید از کانال‌های بافر‌دار استفاده کنیم؟ یا استفاده اشتباه ازشون می‌تونه خودش یه مشکل جدید بسازه؟

بیاید مثال داخل تصویر رو بررسی کنیم.

اینجا فرستنده منتظر گیرنده نمی‌مونه، ولی اگه تعداد داده‌ها بیشتر از ظرفیت بافر بشه چی؟ آیا باید اندازه بافر رو زیاد کنیم یا ی استراتژی دیگه به کار ببریم؟

💠سوال: چطور می‌تونیم بدون افزایش بیش از حد اندازه‌ی بافر، عملکرد و کارایی برنامه رو در شرایط بار بالا تضمین کنیم؟

#گولنگ #گو #بهینه‌سازی_کد #Go
Please open Telegram to view this post
VIEW IN TELEGRAM
Anophel | آنوفل
💢آیا تا حالا براتون پیش اومده تو کدهای Go، فرستنده ی داده منتظر بمونه تا گیرنده آماده بشه؟ ⭐️حالا اگه تعداد گوروتین‌ها زیاد باشه، این انتظار ممکنه به یه گلوگاه توی برنامه تبدیل بشه. ولی آیا همیشه باید از کانال‌های بافر‌دار استفاده کنیم؟ یا استفاده اشتباه…
💢پاسخ سوال: راستش این سوال بستگی به شرایط پروژه داره، ولی چند تا راهکار کلی و کاربردی که می‌تونه کمک کنه ایناس:



💠چندتا گیرنده همزمان (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