首页 > 后端开发 > Golang > 并发,GOROUTINES和GO中的渠道:一项研究

并发,GOROUTINES和GO中的渠道:一项研究

DDD
发布: 2025-01-30 00:03:10
原创
373 人浏览过

>本文探讨了GO的并发功能,专注于goroutines和频道。 并发允许似乎同时处理多个任务,尽管不一定同时处理。 GOROUTINE,GO的轻量级线程是使用go>关键字创建的,可以并发操作。渠道促进了goroutines之间的通信和同步,从而启用数据交换。 发送数据使用ch <- value,在接收用法value := <- ch>。

docker拉动的示例演示了这些概念:

package main

import (
    "fmt"
    "math/rand"
    "os"
    "strconv"
    "sync"
    "time"
)

func main() {
    rand.Seed(time.Now().UnixNano())

    concurrency, _ := strconv.Atoi(os.Args[1]) // Get concurrency level from command line

    if concurrency <= 0 {
        concurrency = 100 // Default concurrency
    }

    progress := make([]int, concurrency)
    var mu sync.Mutex
    var wg sync.WaitGroup
    wg.Add(concurrency)

    for i := 0; i < concurrency; i++ {
        go func(idx int) {
            defer wg.Done()
            for progress[idx] < 100 {
                mu.Lock()
                if progress[idx] >= 100 {
                    mu.Unlock()
                    break
                }
                inc := rand.Intn(10) + 1
                progress[idx] += inc
                if progress[idx] > 100 {
                    progress[idx] = 100
                }
                mu.Unlock()
                time.Sleep(time.Duration(rand.Intn(400)+100) * time.Millisecond)
            }
        }(i)
    }

    done := make(chan struct{})
    go func() {
        wg.Wait()
        close(done)
    }()

    <-done // Wait for all goroutines to complete

    fmt.Println("Progress:", progress)
}程序模拟并发任务。  每个Goroutine都会更新其进度,直到完成为止。 MUTEX更新共享的进度值时可确保线程安全性。 waitgroup同步goroutine完成。


Concurrency, Goroutines, and Channels in Go: A Study

>

键学习

go>该示例突出显示了用于Goroutine创建和并发处理的关键字的使用。 它演示了Goroutines如何同时处理多个进度指标。

>

进一步探索

>此探索提出了有关WaitGroup>的功能(增量/减少计数器和用Wait阻止),静音(防止种族条件)的问题,以及省略它们的后果。 用于检测种族条件的标志需要进一步调查。go test -race

以上是并发,GOROUTINES和GO中的渠道:一项研究的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板