Project Icon

gopool

高性能并发任务管理的 Golang 工作池库

GoPool 是一个高性能的 Golang 工作池库,提供并发任务管理、动态工作器调整和优雅关闭等功能。该库支持任务队列、并发控制、错误处理、超时处理、结果获取和任务重试,性能优于同类库。GoPool 为开发者提供了高效的并发编程解决方案,其 95% 的代码由 GPT 生成。


GoPool

欢迎提交PR 构建和测试 Go报告 发布

English中文

欢迎来到GoPool,这是一个95%的代码由GPT生成的项目。你可以在pro.devchat.ai找到相应的提交和提示列表。

GoPool是一个高性能功能丰富易于使用的Golang工作池库。它旨在管理和回收一组goroutine以并发完成任务,提高应用程序的效率和性能。

性能测试

这个表格展示了三个Go库的性能测试结果:GoPool、antspond。表格包括每个库处理100万个任务所需的时间和内存消耗(MB)。

项目处理100万任务的时间(秒)内存消耗(MB)
GoPool1.132.11
ants1.438.94
pond3.322.20

你可以运行以下命令在你的机器上测试GoPool、ants和pond的性能:

$ go test -benchmem -run=^$ -bench ^BenchmarkGoPoolWithMutex$ github.com/devchat-ai/gopool
$ go test -benchmem -run=^$ -bench ^BenchmarkAnts$ github.com/devchat-ai/gopool
$ go test -benchmem -run=^$ -bench ^BenchmarkPond$ github.com/devchat-ai/gopool

在我的机器上进行性能测试的结果如下:

  • GoPool
go test -benchmem -run=^$ -bench ^BenchmarkGoPool$ github.com/devchat-ai/gopool

goos: darwin
goarch: arm64
pkg: github.com/devchat-ai/gopool
=== RUN   BenchmarkGoPool
BenchmarkGoPool
BenchmarkGoPool-10             1        1131749792 ns/op         2212096 B/op      17447 allocs/op
PASS
ok      github.com/devchat-ai/gopool    1.342s
  • ants
go test -benchmem -run=^$ -bench ^BenchmarkAnts$ github.com/devchat-ai/gopool

goos: darwin
goarch: arm64
pkg: github.com/devchat-ai/gopool
=== RUN   BenchmarkAnts
BenchmarkAnts
BenchmarkAnts-10               1        1429439750 ns/op         9369552 B/op      70259 allocs/op
PASS
ok      github.com/devchat-ai/gopool    1.681s
  • pond
go test -benchmem -run=^$ -bench ^BenchmarkPond$ github.com/devchat-ai/gopool

goos: darwin
goarch: arm64
pkg: github.com/devchat-ai/gopool
=== RUN   BenchmarkPond
BenchmarkPond
BenchmarkPond-10               1        3322063917 ns/op         2310840 B/op      21325 allocs/op
PASS
ok      github.com/devchat-ai/gopool    3.541s

特性

  • 任务队列:GoPool使用线程安全的任务队列来存储等待处理的任务。多个工作者可以同时从这个队列中获取任务。任务队列的大小可以配置。

  • 并发控制:GoPool可以控制并发任务的数量,防止系统过载。

  • 动态工作者调整:GoPool可以根据任务数量和系统负载动态调整工作者的数量。

  • 优雅关闭:GoPool可以优雅地关闭。当没有更多任务或收到关闭信号时,它会停止接受新任务,并等待所有正在进行的任务完成后再关闭。

  • 任务错误处理:GoPool可以处理任务执行过程中发生的错误。

  • 任务超时处理:GoPool可以处理任务执行超时。如果任务在指定的超时时间内未完成,该任务被视为失败并返回超时错误。

  • 任务结果获取:GoPool提供了一种获取任务结果的方法。

  • 任务重试:GoPool为失败的任务提供重试机制。

  • 锁定制化:GoPool支持不同类型的锁。你可以使用内置的sync.Mutex或自定义锁,如spinlock.SpinLock

  • 任务优先级:GoPool支持任务优先级。优先级较高的任务会先被处理。

安装

要安装GoPool,使用go get

go get -u github.com/devchat-ai/gopool

使用

这里是一个使用sync.Mutex的GoPool简单示例:

package main

import (
    "sync"
    "time"

    "github.com/devchat-ai/gopool"
)

func main() {
    pool := gopool.NewGoPool(100)
    defer pool.Release()

    for i := 0; i < 1000; i++ {
        pool.AddTask(func() (interface{}, error){
            time.Sleep(10 * time.Millisecond)
            return nil, nil
        })
    }
    pool.Wait()
}

这里是如何使用spinlock.SpinLock的GoPool示例:

package main

import (
    "time"

    "github.com/daniel-hutao/spinlock"
    "github.com/devchat-ai/gopool"
)

func main() {
    pool := gopool.NewGoPool(100, gopool.WithLock(new(spinlock.SpinLock)))
    defer pool.Release()

    for i := 0; i < 1000; i++ {
        pool.AddTask(func() (interface{}, error){
            time.Sleep(10 * time.Millisecond)
            return nil, nil
        })
    }
    pool.Wait()
}

可配置的任务队列大小

GoPool使用线程安全的任务队列来存储等待处理的任务。多个工作者可以同时从这个队列中获取任务。在创建池时,可以使用WithTaskQueueSize选项配置任务队列的大小。

以下是使用可配置任务队列大小的GoPool示例:

package main
import (
    "time"

    "github.com/devchat-ai/gopool"
)

func main() {
    pool := gopool.NewGoPool(100, gopool.WithTaskQueueSize(5000))
    defer pool.Release()

    for i := 0; i < 1000; i++ {
        pool.AddTask(func() (interface{}, error){
            time.Sleep(10 * time.Millisecond)
            return nil, nil
        })
    }
    pool.Wait()
}

动态工作者调整

GoPool 支持动态工作者调整。这意味着池中的工作者数量可以根据队列中的任务数量增加或减少。通过在创建池时设置 MinWorkers 选项可以启用此功能。

以下是使用动态工作者调整的 GoPool 示例:

package main

import (
    "time"

    "github.com/devchat-ai/gopool"
)

func main() {
    pool := gopool.NewGoPool(100, gopool.WithMinWorkers(50))
    defer pool.Release()

    for i := 0; i < 1000; i++ {
        pool.AddTask(func() (interface{}, error){
            time.Sleep(10 * time.Millisecond)
            return nil, nil
        })
    }
    pool.Wait()
}

在此示例中,池初始有 50 个工作者。如果队列中的任务数量超过当前工作者数量的 3/4,且当前工作者数量小于 MaxWorkers,池将会将工作者数量翻倍,直到达到 MaxWorkers。如果队列中的任务数量为零,且当前工作者数量大于 MinWorkers,池将会将工作者数量减半,直到达到 MinWorkers。

任务超时处理

GoPool 支持任务超时。如果一个任务的执行时间超过指定的超时时间,它将被取消。通过在创建池时设置 WithTimeout 选项可以启用此功能。

以下是使用任务超时的 GoPool 示例:

package main

import (
    "time"

    "github.com/devchat-ai/gopool"
)

func main() {
    pool := gopool.NewGoPool(100, gopool.WithTimeout(1*time.Second))
    defer pool.Release()

    for i := 0; i < 1000; i++ {
        pool.AddTask(func() (interface{}, error) {
            time.Sleep(2 * time.Second)
            return nil, nil
        })
    }
    pool.Wait()
}

在此示例中,如果任务执行时间超过 1 秒,它将被取消。

任务错误处理

GoPool 支持任务错误处理。如果任务返回错误,将调用错误回调函数。通过在创建池时设置 WithErrorCallback 选项可以启用此功能。

以下是使用错误处理的 GoPool 示例:

package main

import (
    "errors"
    "fmt"

    "github.com/devchat-ai/gopool"
)

func main() {
    pool := gopool.NewGoPool(100, gopool.WithErrorCallback(func(err error) {
        fmt.Println("任务错误:", err)
    }))
    defer pool.Release()

    for i := 0; i < 1000; i++ {
        pool.AddTask(func() (interface{}, error) {
            return nil, errors.New("任务错误")
        })
    }
    pool.Wait()
}

在此示例中,如果任务返回错误,错误将被打印到控制台。

任务结果获取

GoPool 支持任务结果获取。如果任务返回结果,将调用结果回调函数。通过在创建池时设置 WithResultCallback 选项可以启用此功能。

以下是使用任务结果获取的 GoPool 示例:

package main

import (
    "fmt"

    "github.com/devchat-ai/gopool"
)

func main() {
    pool := gopool.NewGoPool(100, gopool.WithResultCallback(func(result interface{}) {
        fmt.Println("任务结果:", result)
    }))
    defer pool.Release()

    for i := 0; i < 1000; i++ {
        pool.AddTask(func() (interface{}, error) {
            return "任务结果", nil
        })
    }
    pool.Wait()
}

在此示例中,如果任务返回结果,结果将被打印到控制台。

任务重试

GoPool 支持任务重试。如果任务失败,它可以被重试指定的次数。通过在创建池时设置 WithRetryCount 选项可以启用此功能。

以下是使用任务重试的 GoPool 示例:

package main

import (
    "errors"
    "fmt"

    "github.com/devchat-ai/gopool"
)

func main() {
    pool := gopool.NewGoPool(100, gopool.WithRetryCount(3))
    defer pool.Release()

    for i := 0; i < 1000; i++ {
        pool.AddTask(func() (interface{}, error) {
            return nil, errors.New("任务错误")
        })
    }
    pool.Wait()
}

在此示例中,如果任务失败,它将被重试最多 3 次。

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

AIWritePaper论文写作

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号