今天进行一个协程操作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!的更多相关文章

  1. golang fatal error: all goroutines are asleep - deadlock!

    转自:https://www.cnblogs.com/ghj1976/p/4295013.html http://blog.csdn.net/skh2015java/article/details/6 ...

  2. fatal error: all goroutines are asleep - deadlock!

    一.问题截图 fatal error: all goroutines are asleep - deadlock! goroutine 1 [chan receive]: main.main() /U ...

  3. 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 当调用 ...

  4. 解决 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 ...

  5. mysql解决Fatal error encountered during command execution. 500内部错误

    Asp.net 连接mysql 会出现Fatal error encountered during command execution.的错误 解决办法如下: 连接字符串添加  Allow User ...

  6. 解决fatal error LNK1168的终极方法

    很多人的VC++或Visual studio 会出现fatal error LNK1168错误很是头疼,MS也说不清, 什么改权限.用户名.注册表.CMD,卸载杀毒软件...一切都瞎扯,除非reins ...

  7. 【转】解决:fatal error C1083: 无法打开预编译头文件

    http://blog.csdn.net/aafengyuan/article/details/7988584 是这样的,我创建了一个空项目,并通过"项目属性>C/C++>预编译 ...

  8. 解决Fatal error in launcher: Unable to create process using '"'

    问题 分析原因 网上看了很多方案都说直接运行 python3 -m pip install --upgrade pip 来升级pip版本就好了,这个在大多数情况下都是有用的.因为重装以后会根据更改后的 ...

  9. 解决 “fatal error C1083: ”无法打开包括文件

    添加该项目的附加路径 . 1)右键查看该项目的属性 2)点击配置属性——〉  C/C++  ——〉  常规  ——〉 附加包含目录——〉将缺失文件所在目录添加进去

  10. 解决报错Fatal error in launcher

    换电脑重装python,打算安装第三方库的时候出现错误: Fatal error in launcher 然而在网上搜到的大多数是解决 —— Fatal error in launcher: Unab ...

随机推荐

  1. 2024 MWC上海,“翼”彩纷呈!

    2024年6月26日,2024世界移动通信大会上海(简称"MWC上海")盛大开幕.围绕"未来先行"主题,来自全球的产业.技术和社区等各界代表齐聚一堂,共话产业高 ...

  2. 当 GPT 告诉我9.11大于9.9的时候:AI 仍需完善的一面

    在当今 AI 技术飞速发展的时代,我们对其能力寄予了厚望,期待它们能够准确无误地处理各种任务.然而,最近发生的一件事情让我们意识到,AI 仍然有需要改进和完善的地方. GPT 作为一款备受瞩目的语言模 ...

  3. NebKit简介及工作流程

    引言 随着云计算技术的不断发展,容器化技术已成为现代软件开发和部署的重要组成部分.NebKit作为一个创新的容器编排和管理工具,旨在简化这一过程,提高开发效率和系统的可靠性.本文将对NebKit进行简 ...

  4. 大数据之路Week08_day03 (Hive优化)

    Hive优化(下面的红色标记是十分重要的,大部分情况是需要开启的) 优化1:hive的抓取策略理论上来说,Hive中的所有sql都需要进行mapreduce,但是hive的抓取策略帮我们省略掉了这个过 ...

  5. 面试题57. 和为s的两个数字

    地址:https://leetcode-cn.com/problems/he-wei-sde-liang-ge-shu-zi-lcof/ <?php /** 面试题57. 和为s的两个数字 输入 ...

  6. 【ARM+Qt+OpenCV】基于ARM的双目图像采集系统

    点击查看代码 系统使用ARM处理器,运行linux系统,Qt创建工程编写主程序,可以使用OpenCV进行图像处理. 通过两个摄像头采集会图像,在LCD上进行显示,然后通过LCD上的按钮实现退出程序.保 ...

  7. Selenium KPI接口 窗口句柄

    应用场景: 当单击主页上的链接时,将打开一个新窗口.在新打开的窗口中,无法执行任何操作,因为焦点仍然在主页Web驱动程序上. 这时候,我们需要把焦点定位到新打开的页面上. 先获取所有窗口a=drive ...

  8. nuclei安装使用

    go环境安装 go 下载路径:https://golang.google.cn/dl/ 1.双击 go1.20.7.windows-amd64.msi 2.点击下一步 3.我同意,然后下一步. 4.选 ...

  9. 错误修正记录: [Vivado 12-8300] Launch HLS failed! Please see vitis_hls.log for details.

    起因 使用了Vivado Video Frame Buffer Read和Vivado Video Frame Buffer Write,按out of context模式综合失败.vivado版本2 ...

  10. ant-design-pro 自定义表单 rules规则

    表单输入 <ProFormText name="id" label={intl.formatMessage({ id: 'pages.secret.form.id' })} ...