>本文探讨了GO的并发功能,专注于goroutines和频道。 并发允许似乎同时处理多个任务,尽管不一定同时处理。 GOROUTINE,GO的轻量级线程是使用go
>关键字创建的,可以并发操作。渠道促进了goroutines之间的通信和同步,从而启用数据交换。 发送数据使用ch <- value
,在接收用法value := <- ch
>。
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完成。
>
键学习>
go
>该示例突出显示了用于Goroutine创建和并发处理的关键字的使用。 它演示了Goroutines如何同时处理多个进度指标。 进一步探索
>此探索提出了有关
WaitGroup
>的功能(增量/减少计数器和用Wait
阻止),静音(防止种族条件)的问题,以及省略它们的后果。 用于检测种族条件的标志需要进一步调查。 go test -race
以上是并发,GOROUTINES和GO中的渠道:一项研究的详细内容。更多信息请关注PHP中文网其他相关文章!