all goroutines are asleep - deadlock

简单使用:

package main

import (
"sync"
) type httpPkg struct{} func (httpPkg) Get(url string) {} var http httpPkg func main() {
var wg sync.WaitGroup
var urls = []string{
"http://www.golang.org/",
"http://www.google.com/",
"http://www.somestupidname.com/",
}
for _, url := range urls {
// Increment the WaitGroup counter.
wg.Add(1)
// Launch a goroutine to fetch the URL.
go func(url string) {
// Decrement the counter when the goroutine completes.
defer wg.Done()
// Fetch the URL.
http.Get(url)
}(url)
}
// Wait for all HTTP fetches to complete.
wg.Wait()
}

这是golang官网上的例子

跟java的CountdownLatch差不多,也是阻塞等待所有任务完成之后再继续执行。

简单使用就是在创建一个任务的时候wg.Add(1), 任务完成的时候使用wg.Done()来将任务减一。使用wg.Wait()来阻塞等待所有任务完成。

然后我就写了一个例子:

func main() {
var wg sync.WaitGroup
ch := make(chan int, 1000)
for i := 0; i < 1000; i++ {
wg.Add(1)
go doSomething(i, wg, ch)
}
wg.Wait()
fmt.Println("all done")
for i := 0; i < 1000; i++ {
dd := <-ch
fmt.Println("from ch:"+strconv.Itoa(dd))
}
} func doSomething(index int, wg sync.WaitGroup, ch chan int) {
defer wg.Done()
fmt.Println("start done:" + strconv.Itoa(index))
//time.Sleep(20 * time.Millisecond)
ch <- index
}

然后就报错了:

fatal error: all goroutines are asleep - deadlock!
goroutine 1 [semacquire]:
sync.runtime_Semacquire(0xc42001608c)
/usr/local/Cellar/go/1.10.3/libexec/src/runtime/sema.go:56 +0x39
sync.(*WaitGroup).Wait(0xc420016080)
/usr/local/Cellar/go/1.10.3/libexec/src/sync/waitgroup.go:129 +0x72
main.main()
/Users/taoli/go/src/github.com/c60/cai/tx_gorutine.go:16 +0xea

怎么回事,他说死锁了。

原来这是说,所有的协程都运行完了,你这边还在等待。

什么原因导致的呢?

原来是golang里如果方法传递的不是地址,那么就会做一个拷贝,所以这里调用的wg根本就不是一个对象。

传递的地方传递地址就可以了:

go doSomething(i, &wg, ch)

func doSomething(index int, wg *sync.WaitGroup, ch chan int) {

作者:ironman_
链接:https://www.jianshu.com/p/4c2c80076094
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

最新文章

  1. webstorm的中文教程和技巧分享
  2. C#委托(Action、Func、predicate)
  3. python的paramiko源码修改了一下,写了个操作命令的日志审计 bug修改
  4. lua对模块接口扩展的一种方法
  5. Smart Card Filesystem
  6. C++赋值运算符函数
  7. SQL 添加字段和默认值脚本
  8. Android应用程序的安装位置
  9. --@angularJS--$scope.watch监听模型变化
  10. 浅谈this那些事
  11. javascript中的构造函数和继承
  12. 阿里云CentOS 7系统挂载SSD云盘的教程_Linux
  13. mysql case when then else end 的写法
  14. Java集合性能分析-疯狂Java讲义
  15. py-faster-rcnn
  16. Hadoop生态圈-Oozie实战之逻辑调度执行多个Job
  17. Access导出excel
  18. Vue学习一:{{}}html模板使用方法
  19. iOS正则表达式的使用案例-富文本
  20. UT源码+019

热门文章

  1. python中使用token模拟登录
  2. golang开发:CSP-WaitGroup Mutex
  3. HTTP协议(二)---请求和响应
  4. 关于JSON的零碎小知识
  5. RXJAVA之变换操作
  6. PowerJob 从 0 到 1.9k star 的经历
  7. 【JAVA】JAVA相关知识点收集
  8. 有关java反射的几个小方法的作用和区别
  9. Java Web学习(七)HttpServletResponse(客户端响应)
  10. 关于kafka中consumer subscribe与asssign的理解