گو اینٹس کی تعارف
ants
ایک بہترین کارکردگی والا گوروٹین پول ہے جو بہت سے گوروٹینوں کو منظم و مدیریت کرنے کا انجام دیتا ہے، جس سے وسائل کی حدود اور دوبارہ استعمال کرنے کی اجازت دی جاتی ہے، اور اس طریقے سے تیزی سے کارروائیاں کرتے وقت متناسب وقت کا استعمال ہوتا ہے۔
خصوصیات
- بہت سے گوروٹینوں کو خود بخود منظم کریں اور دوبارہ استعمال کریں۔
- مستقل بازار کرنے کے لیے متاثرہ ہونے والے گوروٹینوں کو منظم کرنا۔
- بہت سی فائدہ مند انٹرفیس فراہم کرتا ہے: کام جمع، چل رہے گوروٹینوں کی تعداد حاصل کرنا، پول کا سائز حسبِ ضرورت استعمال کرنا، پول کو چھوڑنا، اور پول کو دوبارہ چلانا۔
- پروگرام کرش کو روکنے کے لیے پینکس کا نمایاں بنانا۔
- وسائل کو دوبارہ استعمال کرنا مقصود۔ بڑے پیمانے پر بیچ کارروائیوں کے سناریو میں، اصل گوروٹین کنارسی سے بہتر کارکردگی ہے۔
- نان بلاکنگ میکانزم۔
ants
کیسے کام کرتا ہے
فلو چارٹ
متحرک تصاویر
تنصیب
ants
v1 ورژن استعمال کرنے کے لیے:
go get -u github.com/panjf2000/ants
ants
v2 ورژن استعمال کرنے کے لیے (GO111MODULE=on فعال کریں):
go get -u github.com/panjf2000/ants/v2
استعمال
جب آپ گو متزادے پروگرام لکھ رہے ہیں جو بہت سے گوروٹینز کو شروع کرتا ہے، تو خود بخود زیادہ سے زیادہ سسٹم وسائل (یعنی یاد، سی پی یو) کو استعمال کرتا ہے۔ ants
کا استعمال کرتے ہوئے، آپ گوروٹین پول کو کام کرنے کے لیے استعمال کر سکتے ہیں تاکہ وسائل کو دوبارہ استعمال کریں، اور کارکردگی میں بہتری لاسکتے ہیں:
package main
import (
"fmt"
"sync"
"sync/atomic"
"time"
"github.com/panjf2000/ants/v2"
)
var sum int32
func myFunc(i interface{}) {
n := i.(int32)
atomic.AddInt32(&sum, n)
fmt.Printf("run with %d\n", n)
}
func demoFunc() {
time.Sleep(10 * time.Millisecond)
fmt.Println("Hello World!")
}
func main() {
defer ants.Release()
runTimes := 1000
// عام استعمال پول استعمال کریں۔
var wg sync.WaitGroup
syncCalculateSum := func() {
demoFunc()
wg.Done()
}
for i := 0; i < runTimes; i++ {
wg.Add(1)
_ = ants.Submit(syncCalculateSum)
}
wg.Wait()
fmt.Printf("running goroutines: %d\n", ants.Running())
fmt.Printf("finish all tasks.\n")
// پول کا استعمال ایک فنکشن کے ساتھ
// گوروٹین پول اور ایک سیکنڈ کے مدت کے لیے 10 سے ضرورت کی حدیہ.
p, _ := ants.NewPoolWithFunc(10, func(i interface{}) {
myFunc(i)
wg.Done()
})
defer p.Release()
// تسلسل سے کام جمع کریں۔
for i := 0; i < runTimes; i++ {
wg.Add(1)
_ = p.Invoke(int32(i))
}
wg.Wait()
fmt.Printf("running goroutines: %d\n", p.Running())
fmt.Printf("finish all tasks, result is %d\n", sum)
}
پول کنفیگریشن
// Option کو اختیاری فنکشن کی تعینات کرتا ہے۔
type Option func(opts *Options)
// Options وہ سارے اختیارات شامل ہے جو ایک اینٹس پول کو نقل کرتے وقت لاگو کیا جائے گا۔
type Options struct {
// ExpiryDuration ایک مدت ہوتی ہے جو بچھوا گروٹینی کو صاف کرنے کے لئے مرتب گروٹینی کو دھوندتی ہے.
// مکمل کا صف ہر 'ExpiryDuration' کو دورانیہ کے دوران سے جانچتا ہے اور ان گروٹینی کو صاف کرتا ہے جو کہ 'ExpiryDuration' سے زائد استعمال نہیں کیں گئے ہوں۔
ExpiryDuration time.Duration
// PreAlloc یہ ہے کہ پول کو آغاز کرتے وقت کیا صاف کرے.
PreAlloc bool
// Max pool.Submit پر رکا ہوا goroutine کی بند اعداد.
// 0 (اصلی قیمت) کوئی حد نہیں ہے.
MaxBlockingTasks int
// Nonblocking کی صورت میں، Pool.Submit کبھی بھی بند نہیں ہوگا۔
// اگر Pool.Submit فوراً نہیں کیا جا سکے تو ErrPoolOverload لوٹایا جائے گا۔
// Nonblocking کی صورت میں MaxBlockingTasks غیر فعال ہے۔
Nonblocking bool
// PanicHandler ہے جو ہر کام کرنے والی goroutine سے پینک کو ہینڈل کرتا ہے۔
// اگر nil ہوتا ہے تو goroutine سے پینک دوبارہ نکال دیا جائے گا۔
PanicHandler func(interface{})
// لاگر انفارمیشن کے لئے مخصوص لاگر ہے، اگر یہ منظور نہیں ہوا تو،
// ایک معیاری لاگر جو لاب پیکیج سے آتا ہے، کا استعمال ہوتا ہے۔
Logger Logger
}
// WithOptions Optionمان ساتھ ساتھ پرانی اختیارات سطمبال کرتا ہے.
func WithOptions(options Options) Option {
return func(opts *Options) {
*opts = options
}
}
// WithExpiryDuration صاف کرنےgorountines کے وقفہ کا وقت سیٹ کرتا ہے۔
func WithExpiryDuration(expiryDuration time.Duration) Option {
return func(opts *Options) {
opts.ExpiryDuration = expiryDuration
}
}
// پول بنانے کے وقت کیا ورکر کے لئے میموری پری-الاکیشن کرنی چاہئےیہ یہ سیٹ کرتا ہے
func WithPreAlloc(preAlloc bool) Option {
return func(opts *Options) {
opts.PreAlloc = preAlloc
}
}
// MaxBlockingTasks کی حد کو پہنچنے پر رکے ہوئے goroutines کی زیادہ تعداد پر سیٹ کرتا ہے۔
func WithMaxBlockingTasks(maxBlockingTasks int) Option {
return func(opts *Options) {
opts.MaxBlockingTasks = maxBlockingTasks
}
}
// موجودہ کامکاروں کی ان موجودہ ہونے پر nil کرنا۔
func WithNonblocking(nonblocking bool) Option {
return func(opts *Options) {
opts.Nonblocking = nonblocking
}
}
// PanicHandler کو سینجیدہ ہانڈلر سیٹ کرتا ہے۔
func WithPanicHandler(panicHandler func(interface{})) Option {
return func(opts *Options) {
opts.PanicHandler = panicHandler
}
}
// WithLogger ایک مخصوص لاگر سیٹ کرتا ہے۔
func WithLogger(logger Logger) Option {
return func(opts *Options) {
opts.Logger = logger
}
}
NewPool
/NewPoolWithFunc
کو بلانے کے وقت مختلف اختیاری فنکشن کا استعمال کرکےants.Options
کے ہر اشیاء کی قیمتیں تعین کی جا سکتی ہیں، اور پھر انہیں گوروٹین پول کے مطابقت کرنے کے لئے استعمال کیا جا سکتا ہے۔
خود کا پول
ants
کو خود کا پول سہولت فراہم کرتا ہے جس کی مخصوص پول کشی ہے؛ NewPool
فنکشن کو بلا کر، مخصوص کپیسٹی کے ساتھ ایک نیا پول بنایا جا سکتا ہے:
p, _ := ants.NewPool(10000)
کام جمع کرنا
کام ants.Submit(func())
فنکشن کو بلا کر جمع کیا جاتا ہے:
ants.Submit(func(){})
گوروٹین پول کی کپیسٹی کو موزوں بنانا
گوروٹین پول کی کپیسٹی کو موزوں بنانے کے لئے، Tune(int)
فنکشن کا استعمال کیا جا سکتا ہے۔
pool.Tune(1000) // Is ki کپیسٹی کو 1000 پر موزوں کریں
pool.Tune(100000) // Is ki کپیسٹی کو 100000 پر موزوں کریں
یہ فنکشن تھریڈ سیف ہے۔
گوروٹین قطار میموری کی پری-الاکیشن
ants
آپکو پورے پول کے لئے میموری پری-الاکیشن کرنے کی اجازت دیتا ہے، جو کہ کچھ خاص مواقع میں گوروٹین پول کی کارکردگی میں بہتری لاسکتا ہے۔ مثال کے طور پر، ایک بہت بڑی کپیسٹی والے پول کی ضرورت ہو گیا ہے اور ہر گوروٹین کا عمل بغیرہِ وقت کے ہے، gوروٹین قطار کی پری-الاکیشن میموری کو بے ضروری تعین کرنے کو کم کرے گی۔
// انس will pre-malloc the whole capacity of pool when you invoke this function
p, _ := ants.NewPool(100000, ants.WithPreAlloc(true))
پول ریلیس کریں
pool.Release()
پول دوبارہ چلائیں
// Reboot() هتھاو٬ سے زیادہ تر قلا ق کو نیکال دینے کے بعد اس کو دوبارہ فعال کرنے کے لئے
pool.Reboot()
تفویض کارروائی کے بارے میں
ants
تفویض کرنے کے ترتیب کو ضمانت نہیں دیتا، اور کارروائی کا ترتیب ضروری طور پر داخل کرنے کے ترتیب کے ساتھ مطابقت رکھتا ہے۔ یہ اسلئے کہ ants
تمام داخل کردہ تسکس کو متزامن طور پر پروسیس کرتا ہے، اور تسکس ورکرز کو دیں جائیں گے جو متزامن طور پر چل رہے ہوں، جس سے تسکس کا متزامن اور غیر یقینی ترتیب میں کارروائی ہوتی ہے۔