golang-panjf2000/ants 協程池實際使用小結


原文鏈接:https://studygolang.com/articles/27181

//注意
//線程池執行有兩種,一種執行普通邏輯方法pool,可接受所有方法,另一種執行形同類型的方法(就是每次接收的內容方法都一樣)
//使用前需要先建立一個對應的pool對象,參數是容量大小和過期時間等, 如果使用普通方法,有默認方法可以使用
//使用后,需要調用Release來結束使用,意思就是close那類的意思
//總的來說,使用過程就是,新建對象,加入邏輯函數代碼,結束使用關閉對象。
package main

import (
    "fmt"
    "log"
    "sync"
    "time"

    "github.com/panjf2000/ants"
)

const (
    runTime = 100
)

func demosFunc() {
    time.Sleep(10 * time.Millisecond)
    fmt.Println("Hello World!")
}

func demoFunc() {
    time.Sleep(time.Duration(BenchParam) * time.Millisecond)
}

//antsDefaultCommon 使用默認普通pool
//其實就是使用了普通的pool,為了方便直接使用,在內部已經new了一個普通的pool,
//相當於下面那個新建的過程給你寫好了,容量大小和過期時間都用默認的,詳細信息可以看源碼,里面剝一層就可以看到
//例子三
func antsDefaultCommon() {
    var wg sync.WaitGroup //這里使用等待是為了看出結果,阻塞主線程,防止直接停止,如果在web項目中,就不需要

    defer ants.Release() //退出工作,相當於使用后關閉
    log.Println("start ants work")
    for i := 0; i < runTime; i++ {
        wg.Add(1)
        ants.Submit(func() { //提交函數,將邏輯函數提交至work中執行,這里寫入自己的邏輯
            log.Println(i, ":hello")
            time.Sleep(time.Millisecond * 10)
            wg.Done()
        })
    }
    wg.Wait()
    log.Println("stop ants work")
}

//antsCommon 使用普通的pool
//例子一
func antsCommon() {

    p, _ := ants.NewPool(BenchAntsSize, ants.WithExpiryDuration(DefaultExpiredTime)) //新建一個pool對象,其他同上
    defer p.Release()
    for j := 0; j < runTime; j++ {
        _ = p.Submit(func() {
            log.Println(":hello")
            time.Sleep(time.Millisecond * 10)
        })
    }

}

//antsMarkFuncPut 使用特定的帶有函數內容的pool
//例子二
func antsMarkFuncPut() {
    var wg sync.WaitGroup

    p, _ := ants.NewPoolWithFunc(10, func(i interface{}) { //新建一個帶有同類方法的pool對象
        myFunc(i)
        wg.Done()
    })
    defer p.Release()
    // Submit tasks one by one.
    for i := 0; i < runTime; i++ {
        wg.Add(1)
        _ = p.Invoke(int32(i))
 //這個就是發送,相當於上述普通的pool的submit,唯一不同的是參數,因為這個發送的同類型的方法,加入邏輯代碼時注意
    }
    wg.Wait()
    fmt.Printf("running goroutines: %d\n", p.Running())
    fmt.Printf("finish all tasks, result is %d\n", sum)
    if sum != 499500 {
        panic("the final result is wrong!!!")
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM