zoukankan      html  css  js  c++  java
  • Golang

    golang中有2种方式同步程序,一种使用channel,另一种使用锁机制。使用channel的案例可以参考博客:golang--使用channel来同步goroutine,这里要涉及的是锁机制,更具体的是sync.WaitGroup,一种较为简单的同步方法集。

    sync.WaitGroup只有3个方法,Add(),Done(),Wait()。其中Done()是Add(-1)的别名。简单的来说,使用Add()添加计数,Done()减掉一个计数,计数不为0, 阻塞Wait()的运行。

    要注意的有一点。sync文档已经说明了的,The main goroutine calls Add to set the number of goroutines to wait for. Then each of the goroutines runs and calls Done when finished.也就是说,在运行main函数的goroutine里运行Add()函数,在其他的goroutine里面运行Done()函数。这个我是踩过雷了的。

    最简单的案例就是sync文档里面的example,这里简单写了一个例子。

    package main
    
    import (
        "fmt"
        "sync"
    )
    
    func main() {
        var wg sync.WaitGroup
        for i := 0; i < 100; i++ {
            wg.Add(1)
        }
    
        for i := 0; i < 100; i++ {
            go wg.Done()
        }
        fmt.Println("exit")
        wg.Wait()
    }
    
    func add(wg sync.WaitGroup) {
        wg.Add(1)
    }
    
    
    func done(wg sync.WaitGroup) {
        wg.Done()
    }
    

    在自己的电脑使用godoc搭载的sync文档中,有一个bug,注明添加该包的方法是import "pkg/sync"。一般程序都是import "sync"。我自己测试了一下,import "sync"才是正确的,import "pkg/sync"编译都通不过。各位也可以测试一下。在golang.org已经改正过来了。

    参考资料

  • 相关阅读:
    构建之法
    第一阶段SCRUM冲刺
    NABCD项目分析
    结对开发
    梦断代码阅读-04
    梦断代码阅读-05
    移动端疫情展示
    用Python爬取疫情数据
    全球疫情可视化地图
    第二阶段冲刺第三天个人记录
  • 原文地址:https://www.cnblogs.com/pzblog/p/9088304.html
Copyright © 2011-2022 走看看