Skip to content

yiigo/nightfall

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

59 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

nightfall

golang GitHub release pkg.go.dev Apache 2.0 license

Go协程并发复用,降低CPU和内存负载

特点

  1. 实现简单
  2. 性能优异
  3. 采用「生产-消费」模式
  4. 任务支持 context
  5. 任务队列支持缓冲大小设置
  6. 非阻塞模式下,任务缓存到全局链表
  7. 配套设施:errgrouptimewheel

安装

go get -u github.com/yiigo/nightfall

流程图

flowchart.jpg

效果

goos: darwin
goarch: amd64
cpu: Intel(R) Core(TM) i5-1038NG7 CPU @ 2.00GHz

场景-1

👉 nightfall

func main() {
    ctx := context.Background()

    pool := woker.NewPool(5000)
    for i := 0; i < 100000000; i++ {
        i := i
        pool.Go(ctx, func(ctx context.Context) {
            time.Sleep(time.Second)
            fmt.Println("Index:", i)
        })
    }

    <-ctx.Done()
}
cpu

nightfall_cpu_1.png

mem

nightfall_mem_1.png

👉 ants

func main() {
    ctx := context.Background()

    pool, _ := ants.NewPool(5000)
    for i := 0; i < 100000000; i++ {
        i := i
        pool.Submit(func() {
            time.Sleep(time.Second)
            fmt.Println("Index:", i)
        })
    }

    <-ctx.Done()
}
cpu

ants_cpu_1.png

mem

ants_mem_1.png

场景-2

👉 nightfall

func main() {
    ctx := context.Background()

    pool := woker.NewPool(5000)
    for i := 0; i < 100; i++ {
        i := i
        pool.Go(ctx, func(ctx context.Context) {
            for j := 0; j < 1000000; j++ {
                j := j
                pool.Go(ctx, func(ctx context.Context) {
                    time.Sleep(time.Second)
                    fmt.Println("Index:", i, "-", j)
                })
            }
        })
    }

    <-ctx.Done()
}
cpu

nightfall_cpu_2.png

mem

nightfall_mem_2.png

👉 ants

func main() {
    ctx := context.Background()

    pool, _ := ants.NewPool(5000)
    for i := 0; i < 100; i++ {
        i := i
        pool.Submit(func() {
            for j := 0; j < 1000000; j++ {
                j := j
                pool.Submit(func() {
                    time.Sleep(time.Second)
                    fmt.Println("Index:", i, "-", j)
                })
            }
        })
    }

    <-ctx.Done()
}
cpu

ants_cpu_2.png

mem

ants_mem_2.png