গো এন্টস এ পরিচিতি

ants হল একটি হাই-পারফরমেন্স গোরুটিন পুল, যা একটি বৃহত সংখ্যক গোরুটিনের সংরক্ষণ এবং ব্যবস্থাপনা বোঝায়, যাতে সময়ানুসারে এবং সহজেই স্মাৃতি ব্যবহার এবং পুনরাবৃত্তি সম্ভব হয়। এতে ব্যবহারকারীদের বৈচিত্র্যপূর্ণ সময় মানে এবং অধিক সক্রিয় টাস্ক নিষ্পাদনে সাহায্য করে।

বৈশিষ্ট্য

  • স্বয়ংক্রিয় ভাবে একটি বৃহত সংখ্যক গোরুটিন সংক্রান্ত এবং অব্যবহৃত করা হয়।
  • সময়োপস্থিত গোরুটিনগুলি নিয়মিতভাবে পরিষ্কার করে স্রোত সংরক্ষণ অনেকটাই বেড়ে এবং সরবরাহ করে।
  • একটি বৃহত সংখ্যক গোরুটিনের সম্পর্কে প্রয়োজনীয় ইন্টারফেস সরবরাহ করে: টাস্ক জমা, চলমান গোরুটিনের সংখ্যা প্রাপ্ত করা, পুল আকার পছন্দসই সংশোধন, পুল মুক্ত করা, এবং পুনরারম্ভ করা।
  • প্যানিক্স সুস্থ ভাবে নিযোন্ত্রণ করা, নিকৃষ্ট অবস্থান দুর্যোগ প্রতিরোধ করা।
  • সংসাধোণ প্রচুর মেমোরি ব্যবহার মাত্রা বেড়ে। বড় ধরণের ব্যাচ সমভাবনামূলক টাস্ক অবস্থানে, এর নাটিভ গোরুটিন এক্ষমতার থেকে দ্রুততর করে।
  • ব্লকিং কিফায়তিসই

ants কিভাবে কাজ করে

প্রবাহ চার্ট

ants-flowchart-cn

অ্যানিমেটেড মুভিজ

ইনস্টলেশন

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("এর সাথে চালান %d\n", n)
}

func demoFunc() {
	time.Sleep(10 * time.Millisecond)
	fmt.Println("হ্যালো ওয়ার্ল্ড!")
}

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("চলমান গোরুটিনগুলি: %d\n", ants.Running())
	fmt.Printf("সমস্ত কাজ সমাপ্ত।\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("চলমান গোরুটিনগুলি: %d\n", p.Running())
	fmt.Printf("সমস্ত কাজ সমাপ্ত, ফলাফল %d\n", sum)
}

পুল কনফিগারেশন

// Option একটি ঐচ্ছিক ফাংশন প্রতিনিধিত্ব করে।
type Option func(opts *Options)

// সব সেটিংস ধারণ করে যা একটি এন্টস পুল তৈরি করা হবার সময় প্রয়োগ হবে।
type Options struct {
	// ExpiryDuration হল স্ক্যাভেঞ্জার গোরুটিন এই সময় দ্রুত শ্রমিকদের পরিষ্কার করতে,
	// স্ক্যাভেঞ্জার প্রতি `ExpiryDuration` স্ক্যান করে এবং ঐ শ্রমিককে পরিষ্কার করে যেগুলি আর ব্যবহৃত হয়নি
	// `ExpiryDuration` এর চেয়ে বেশি।
    ExpiryDuration time.Duration

	// PreAlloc ইনিশিয়ালাইজ পুল সময়ে মেমরি পূর্ব-আবাদন করা করতে নির্দেশক কিনা তা নির্দেশ করে।
	PreAlloc bool

	// Max goroutine এর সর্বাধিক সংখ্যা।
	// 0 (ডিফল্ট মান) এর অর্থ এমন কোন সীমা নেই।
    MaxBlockingTasks int

	// Nonblocking যখন সত্য, পুল অনুবর্তী।
	// পুল.Submit কখনই ব্লক হবে না।
    // পুল.Submit আমরা পুরবে ধারণা করা MaxBlockingTasks এর সর্বাধিক সংখ্যা যখন Nonblocking সত্য।
	Nonblocking bool

	// PanicHandler একটি প্যানিক হ্যান্ডলার হ্যান্ডল করার জন্য ব্যবহৃত হয়।
	// যদি না হয়, প্যানিকগুলি আবার শ্রমিক গোরুটিন থেকে প্রসারিত হবে।
    PanicHandler func(interface{})

	// Logger হল লগিং ইনফোর্মেশন এর জন্য কাস্টমাইজড লগগার।
	// যদি সেট না হয় তাহলে, ডিফল্ট মানে লগ প্যাকেজ থেকে ডিফল্ট স্ট্যান্ডার্ড লগার ব্যবহৃত হয়।
    Logger Logger
}

// WithOptions পুরো অপশন কনফিগ গ্রহণ করে।
func WithOptions(options Options) Option {
	return func(opts *Options) {
		*opts = options
	}
}

// WithExpiryDuration কার্যত পরিষ্কারের মধ্যে মঞ্চের ব্যাপারী সময়ের মঞ্চ সেটআপ করে।
func WithExpiryDuration(expiryDuration time.Duration) Option {
	return func(opts *Options) {
		opts.ExpiryDuration = expiryDuration
	}
}

// WithPreAlloc ধারণা করা হোক যে শ্রমিক চালাতে করতে হবে কিনা।
func WithPreAlloc(preAlloc bool) Option {
	return func(opts *Options) {
		opts.PreAlloc = preAlloc
	}
}

// WithMaxBlockingTasks পুল ক্ষমতা গুচ্ছের সীমা তদন্তের সর্বাধিক সংখ্যা সেট করে।
func WithMaxBlockingTasks(maxBlockingTasks int) Option {
	return func(opts *Options) {
		opts.MaxBlockingTasks = maxBlockingTasks
	}
}

// WithNonblocking দেখায় যে পুল প্রায় শ্রমিক না থাকলে নিল ফিরে দিবে।
func WithNonblocking(nonblocking bool) Option {
	return func(opts *Options) {
		opts.Nonblocking = nonblocking
	}
}

// WithPanicHandler প্যানিক হ্যান্ডলার সেট করে।
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) // এর ক্ষমতা 1000 এ সেট করা
pool.Tune(100000) // এর ক্ষমতা 100000 এ সেট করা

এই মেথড ধারাপালি নিরাপদ।

গোরুটি কিউ মেমরি প্রিএলোকেট করা

ants আন্টস আপনি পুলের সম্পূর্ণ চাপো পূর্বমন্ত্রিত মেমরি প্রিএলোকেট করার মৌলিক অনুমতি দেয়, যা কিছু নির্দিষ্ট প্রস্থত স্থিতিতে গোরুটি পুলের কর্মীদের ক্ষমতা লাভ করতে পারে। যেমন, যখন প্রয়োজন একটি পূল এর সাথে একটি যথাসম্ভব বড় ক্ষমতা রয়েছিল এবং প্রতিটি গোরুটির মধ্যে সময় গ্রাহকগণের সময় অপ্রয়োজনীয় মেমরি প্রিএলোকেট করা হয়, তবে গোরুটি কিউর জন্য অপ্রয়োজনীয় মেমরি পুনশ্চেষ্টা কমিয়ে যাবে তার পরিণাম হতে পারে।

// আপনি যখন এই ফাংশনটি ডাকবেন, তখন এন্টস পূলের পূর্ণ ধারণ ধরে মেমরি প্রি-ম্যাল্ক করবে
p, _ := ants.NewPool(100000, ants.WithPreAlloc(true))

পুল মুক্তি দিন

pool.Release()

পুনরায় শুরু করা

// পূর্ববত পুল আবার সক্রিয় করতে এক্টিভেট() মেথড কল করে আপনি একটি পুল পুনরায় শুরু করতে পারেন।
pool.Reboot()

কাজের পরিক্রমা সম্পর্কে

ants কাজের পরিক্রমা নিশ্চিত করে না, এবং কাজের পরিক্রমা অবশ্যই প্রেরণের পরিক্রমার সাথে সামঞ্জস্যপূর্ণ নয়। এটির কারণ হলো ants সমস্ত প্রেরিত কাজগুলি একই সাথে প্রক্রিয়া করে, এবং কাজগুলি সমতুল্য চালনার শ্রমিকদের কাছে দেওয়া হবে, ফলে কাজগুলি সমতুল্য এবং অনির্নয়মিত পরিক্রমায় কাজ সম্পাদন করার ফলাফল হয়।