Golang解决fatal error: all goroutines are asleep - deadlock!
今天进行一个协程操作demo时总是报错
//workerpool.go
package main
import (
"fmt"
"time"
)
//工作线程
func workerPool(jobs <-chan int, results chan<- int) {
for j := range jobs {
fmt.Println("start job", j)
time.Sleep(time.Second) //模拟耗时工作
fmt.Println("finish job", j)
results <- j
}
}
func main() {
const numJobs = 5
jobs := make(chan int, numJobs) //
results := make(chan int, numJobs) //
go workerPool(jobs, results)
for i := 1; i <= numJobs; i++ {
jobs <- i
}
close(jobs)
for r := range results {
fmt.Println("results :", r)
}
}
go run workerpool.go 报错
start job 1
finish job 1
start job 2
results : 1
finish job 2
start job 3
results : 2
finish job 3
start job 4
results : 3
finish job 4
start job 5
results : 4
finish job 5
fatal error: all goroutines are asleep - deadlock!
results : 5
goroutine 1 [chan receive]:
main.main()
workerpool.go:30 +0x19d
asleep就是说协程都在睡觉没做事
问题应该出在遍历jobs上, jobs遍历完没数据可操作了,引发 asleep - deadlock 报错
改进方法:
1、是无限循环输入数据到jobs
2、用waitGroup
方法1的无限循环输入数据就不做介绍了,比较简单
下面展示一下方法2使用waitGroup的方式
package main
import (
"fmt"
"sync"
"time"
)
var wg sync.WaitGroup
//工作线程
func workerPool(jobs <-chan int, results chan<- int) {
for j := range jobs {
fmt.Println("start job", j)
time.Sleep(time.Second)
fmt.Println("finish job", j)
results <- j
}
}
func init() {
wg = sync.WaitGroup{}
}
func main() {
const numJobs = 5
jobs := make(chan int) //
results := make(chan int) //
go workerPool(jobs, results)
go func() {
for r := range results {
fmt.Println("results :", r)
wg.Done()//接收到数据,表示完成了一份工作
}
}()
for i := 1; i <= numJobs; i++ {
wg.Add(1)//标记开始一份工作
jobs <- i
}
wg.Wait()
}
正常运行结果如下:
start job 1
finish job 1
start job 2
results : 1
finish job 2
start job 3
results : 2
finish job 3
start job 4
results : 3
finish job 4
start job 5
results : 4
finish job 5
results : 5
Process finished with exit code 0
Golang解决fatal error: all goroutines are asleep - deadlock!的更多相关文章
- golang fatal error: all goroutines are asleep - deadlock!
转自:https://www.cnblogs.com/ghj1976/p/4295013.html http://blog.csdn.net/skh2015java/article/details/6 ...
- fatal error: all goroutines are asleep - deadlock!
一.问题截图 fatal error: all goroutines are asleep - deadlock! goroutine 1 [chan receive]: main.main() /U ...
- ubuntu 16.04 + eigen3 安装(解决 fatal error: Eigen/Core: No such file or directory)
1.安装 sudo apt-get install libeigen3-dev 2. 解决 fatal error: Eigen/Core: No such file or directory 当调用 ...
- 解决 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 问题
https://blog.csdn.net/weixin_41196185/article/details/81114226 今天在启动vue项目的时候报了这样一个错误 观察到关键词是 FATAL E ...
- mysql解决Fatal error encountered during command execution. 500内部错误
Asp.net 连接mysql 会出现Fatal error encountered during command execution.的错误 解决办法如下: 连接字符串添加 Allow User ...
- 解决fatal error LNK1168的终极方法
很多人的VC++或Visual studio 会出现fatal error LNK1168错误很是头疼,MS也说不清, 什么改权限.用户名.注册表.CMD,卸载杀毒软件...一切都瞎扯,除非reins ...
- 【转】解决:fatal error C1083: 无法打开预编译头文件
http://blog.csdn.net/aafengyuan/article/details/7988584 是这样的,我创建了一个空项目,并通过"项目属性>C/C++>预编译 ...
- 解决Fatal error in launcher: Unable to create process using '"'
问题 分析原因 网上看了很多方案都说直接运行 python3 -m pip install --upgrade pip 来升级pip版本就好了,这个在大多数情况下都是有用的.因为重装以后会根据更改后的 ...
- 解决 “fatal error C1083: ”无法打开包括文件
添加该项目的附加路径 . 1)右键查看该项目的属性 2)点击配置属性——〉 C/C++ ——〉 常规 ——〉 附加包含目录——〉将缺失文件所在目录添加进去
- 解决报错Fatal error in launcher
换电脑重装python,打算安装第三方库的时候出现错误: Fatal error in launcher 然而在网上搜到的大多数是解决 —— Fatal error in launcher: Unab ...
随机推荐
- web95 比较麻烦的interval绕过
审计 include("flag.php"); highlight_file(__FILE__); if(isset($_GET['num'])){ $num = $_GET['n ...
- linux下自建NAS教程
NAS,英文全名Network Attached Storage,翻译过来是:网络附接存储. 引用维基百科定义 网络附接存储(英语:Network Attached Storage,缩写:NAS)[1 ...
- LeetCode刷题:runtime error: reference binding to null pointer of type 'int' (stl_vector.h)报错请教
题目:https://leetcode.cn/problems/merge-intervals/ 错误代码: // 思路初探:做了很多道类似区间操作的题目了.本题就是尽可能少的创建新区间 // 1.首 ...
- [文件格式/数据存储] Parquet:开源、高效的列式存储文件格式协议
序:缘起 => 用 java 读取 parquet 文件 生产环境有设备出重大事故,又因一关键功能无法使用,亟需将生产环境的原始MQTT报文(以 parquet 文件格式 + zstd 压缩格式 ...
- 【忍者算法】从图书馆找书到矩阵搜索:探索二维矩阵中的高效搜索|LeetCode第240题 搜索二维矩阵 II
从图书馆找书到矩阵搜索:探索二维矩阵中的高效搜索 生活中的搜索策略 想象你在一个大型图书馆里找书.这个图书馆的书架是按照两个维度排列的:每个书架从左到右按书名字母顺序排列,从上到下的书架则按照出版年份 ...
- DeepSeek-R1的“思考”艺术,你真的了解吗?
大家好~,这里是AI粉嫩特攻队!今天咱们来聊聊一个有趣的话题--DeepSeek-R1到底什么时候会"思考",什么时候又会选择"偷懒"? 最近有朋友问我:&qu ...
- 海康SDK报错Structure.getFieldOrder()
就是你调用的这个结构体以及其引用的其他结构体,可能没有getFieldOrder()的方法,你只要按照顺序把他填上去就好了.比如 public static class NET_DVR_TIME ex ...
- Memcached深度剖析:解锁高性能分布式内存缓存的秘密
引言 在当今快节奏的互联网世界中,应用程序的响应速度往往是用户体验的关键.为了提升性能,减轻数据库的压力,Memcached作为一种高性能的分布式内存对象缓存系统,被广泛应用于加速动态Web应用程序. ...
- 【攻防世界】wzsc_文件上传
wzsc_文件上传 题目来源 攻防世界 NO.GFSJ0997 题目描述 经典上传页面 用御剑扫出upload文件夹 /upload路径下是上传的文件 题解 新建几个空文件,发现后缀为txt的文件可以 ...
- 【前端解决方案】已有本地项目如何建立github仓库
步骤 1:在本地初始化 Git(如果还没初始化) 如果你的本地项目还没有 Git 仓库,先进入你的项目目录,并初始化 Git: cd /你的本地项目路径 git init 这样会在你的项目中创建一 ...