怎么在golang中利用并发实现协程同步

  介绍

怎么在golang中利用并发实现协程同步?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

Java中有一系列的线程同步的方法,去里面有goroutine(协程),先看下下面的代码执行的结果是什么呢?

, package 主要   ,import  (   ,才能“fmt"   )   ,func  main (), {   go 才能;func (), {   ,,,fmt.Println (“Goroutine  1“)   }()才能   go 才能;func (), {   ,,,fmt.Println (“Goroutine  2“)   }()才能   }

执行以上代码很可能看不到输出。

因为有可能这两个协程还没得到执行,主协程就已经结束了,而主协程结束时会结束所有其他协程,所以导致代码运行的结果什么都没有。

估计不少新接触去的童鞋都会对此郁闷吗?,可能会问那么该如何等待主协程中创建的协程执行完毕之后再结束主协程呢?

<强>下面说几种可以解决的方法:

<强>睡眠一段时间

在主方法退出之睡眠前一段时间就可能会出现结果了,如下代码:

, package 主要   ,import  (   ,才能“fmt"   “才能time"   ,)   ,func  main (), {   ,,go  func (), {   ,,,fmt.Println (“Goroutine  1“)   }()才能   go 才能;func (), {   ,,,fmt.Println (“Goroutine  2“)   }()才能   time . sleep才能(time.Second  *, 1),//,睡眠1秒,等待上面两个协程结束   }

这两个简单的协程执行消耗的时间很短的,所以你会发现现在就有结果出现了。

Goroutine 1
Goroutine 2

为什么上面我要说“可能会出现”?

因为睡眠这个时间目前是设置的1 s,如果我这两个协程里面执行了很复杂的逻辑操作(时间大于1 s),那么就会发现依旧也是无结果打印出来的。

那么就可以发现这种方式得到问题所在了:我们无法确定需要睡眠多久

上面那种方式有问题,去里面其实也可以用管道来实现同步的。

<强>管道实现同步

那么用管道怎么实现同步呢?显示代码:

, package 主要   ,import  (   ,才能“fmt"   ,)   ,func  main (), {   ,,ch :=, (chan 结构{})   count 才能;:=,2,//,count 表示活动的协程个数   go 才能;func (), {   ,,,fmt.Println (“Goroutine  1“)   ,,,ch  & lt;作用;结构{}{},//,协程结束,发出信号   }()才能   go 才能;func (), {   ,,,fmt.Println (“Goroutine  2“)   ,,,ch  & lt;作用;结构{}{},//,协程结束,发出信号   }()才能   for 才能range  ch  {   ,,,//,每次从ch中接收数据,表明一个活动的协程结束   ,,,,计数   ,,,//,当所有活动的协程都结束时,关闭管道   ,,,if  count ==, 0, {   ,,,,,关闭(ch)   ,,,}   ,,}   }

这种方式是一种比较完美的解决方案,goroutine/通道它们也是在去里面经常搭配在一起的一对。

<强>同步。WaitGroup

其实去里面也提供了更简单的方式,使用同步。WaitGroup .

WaitGroup顾名思义,就是用来等待一组操作完成的.WaitGroup内部实现了一个计数器,用来记录未完成的操作个数,它提供了三个方法:

<李>

Add()用来添加计数

<李>

完成()用来在操作结束时调用,使计数减一

<李>

()用等待来等待所有的操作结束,即计数变为0,该函数会在计数不为0时等待,在计数为0时立即返回

继续显示代码:

package 主要   ,import  (   ,才能“fmt"   “才能sync"   ,)   ,func  main (), {   var 才能;wg  sync.WaitGroup   wg.Add才能(2),//,因为有两个动作,所以增加2个计数   go 才能;func (), {   ,,,fmt.Println (“Goroutine  1“)   ,,,wg.Done(),//,操作完成,减少一个计数   }()才能   go 才能;func (), {   ,,,fmt.Println (“Goroutine  2“)   ,,,wg.Done(),//,操作完成,减少一个计数   }()才能   wg.Wait才能(),//,等待,直到计数为0   } golang适合做什么

golang可以做服务器端开发,但golang很适合做日志处理,数据打包,虚拟机处理,数据库代理等工作。在网络编程方面,它还广泛应用于网络应用,API应用等领域。

怎么在golang中利用并发实现协程同步