Maison  >  Article  >  développement back-end  >  Partagez une bibliothèque de contrôle de concurrence GO très simple à utiliser !

Partagez une bibliothèque de contrôle de concurrence GO très simple à utiliser !

藏色散人
藏色散人avant
2022-12-21 18:01:404723parcourir

Cet article vous présentera les connaissances pertinentes sur Golang et parlera d'une bibliothèque de contrôle de concurrence Golang très facile à utiliser. J'espère qu'il vous sera utile.

Partagez une bibliothèque de contrôle de concurrence GO très simple à utiliser !

Concurrency

Build Status

installer

GOPROXY=https://goproxy.cn go get -v github.com/lxzan/concurrency@latest

Fonctionnalité

  • Limitation du nombre de coroutines simultanées
  • Supportcontex.Contexcontex.Contex
  • 支持 panic recover, 返回包含错误堆栈的 error
  • 递归实现的任务调度, 不依赖 time.Tickerchannel

Usage

  • WorkerGroup 工作组, 添加一组任务, 等待执行完成, 可以很好的替代WaitGroup
  • Supportpanique récupérer, renvoie <code>erreur, y compris la pile d'erreurs
    planification des tâches implémentée de manière récursive, ne repose pas sur time.Ticker et canal
Usage🎜🎜🎜Groupe de travail WorkerGroup, ajouter un groupe de tâches, attendre la fin de l'exécution, peut être un bon remplacement pour WaitGroup.🎜🎜
package mainimport (
    "fmt"
    "github.com/lxzan/concurrency"
    "sync/atomic")func main() {
    sum := int64(0)
    w := concurrency.NewWorkerGroup()
    for i := int64(1); i <= 10; i++ {
        w.AddJob(concurrency.Job{
            Args: i,
            Do: func(args interface{}) error {
                fmt.Printf("%v ", args)
                atomic.AddInt64(&sum, args.(int64))
                return nil
            },
        })
    }
    w.StartAndWait()
    fmt.Printf("sum=%d\n", sum)}
4 5 6 7 8 9 10 1 3 2 sum=55
🎜🎜File d'attente de travail WorkerQueue, vous pouvez continuellement ajoutez-y des tâches, une fois qu'elles sont exécutées, lorsque les ressources CPU sont libres [Recommandé : 🎜go tutoriel🎜]🎜🎜
package mainimport (
    "fmt"
    "github.com/lxzan/concurrency"
    "time")func Add(args interface{}) error {
    arr := args.([]int)
    ans := 0
    for _, item := range arr {
        ans += item    }
    fmt.Printf("args=%v, ans=%d\n", args, ans)
    return nil}func Mul(args interface{}) error {
    arr := args.([]int)
    ans := 1
    for _, item := range arr {
        ans *= item    }
    fmt.Printf("args=%v, ans=%d\n", args, ans)
    return nil}func main() {
    args1 := []int{1, 3}
    args2 := []int{1, 3, 5}
    w := concurrency.NewWorkerQueue()
    w.AddJob(
        concurrency.Job{Args: args1, Do: Add},
        concurrency.Job{Args: args1, Do: Mul},
        concurrency.Job{Args: args2, Do: Add},
        concurrency.Job{Args: args2, Do: Mul},
    )
    w.StopAndWait(30*time.Second)}
args=[1 3], ans=4args=[1 3 5], ans=15args=[1 3], ans=3args=[1 3 5], ans=9

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer