Golang中goroutines和channels导致程序卡住的原因是什么
Golang中goroutines和channels导致程序卡住的原因是什么 这是我的代码链接。
出于某种原因,我的代码向通道添加了一个作业后就挂起了,没有任何内容被执行,程序一直等待直到我终止它。对于Go及其并发,我是一个初学者,所以对于可能犯的任何低级错误,我表示歉意,但我完全卡住了,一点头绪都没有,不知道为什么会发生这种情况。
你可以尝试类似这样的方法: https://play.golang.org/p/l7V4BqWiapa
更多关于Golang中goroutines和channels导致程序卡住的原因是什么的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
如果账户数量超过1000,你的 jobsChannel 会在第25行填满其缓冲容量,而你在第31行才开始启动工作协程。
将启动工作协程的循环移到填充任务的循环之前运行。工作协程会等待从 jobsChannel 中获取任务,并在任务插入时将其取出。
确保在 wg.Wait() 之后关闭通道,这样工作协程就知道停止尝试从 jobsChannel 中获取任务并返回以释放其内存。
你的代码在 main 函数中创建了一个无缓冲通道 jobs,然后启动了一个 goroutine 来执行 processJobs 函数。然而,processJobs 函数内部通过 range 循环从通道接收数据,而主 goroutine 在向通道发送一个作业后,没有关闭通道,也没有其他 goroutine 继续发送数据,导致 processJobs 中的 range 循环一直等待接收下一个值,程序因此阻塞。
具体来说,问题在于:
- 无缓冲通道在发送操作后会阻塞,直到有接收方准备好接收。
- 使用
range循环从通道接收数据时,循环会持续尝试接收,直到通道被关闭。由于你没有关闭通道,processJobs中的range循环会一直等待,即使没有更多的数据发送。
以下是你的代码示例及修改:
package main
import (
"fmt"
"time"
)
func processJobs(jobs <-chan int) {
for job := range jobs {
fmt.Println("Processing job", job)
time.Sleep(1 * time.Second) // 模拟处理时间
}
fmt.Println("All jobs processed")
}
func main() {
jobs := make(chan int)
go processJobs(jobs)
// 发送作业到通道
jobs <- 1
// 关闭通道,通知接收方没有更多数据
close(jobs)
// 等待足够时间让 goroutine 完成处理
time.Sleep(2 * time.Second)
}
修改说明:
- 在
main函数中发送作业后,调用close(jobs)关闭通道。这样processJobs函数中的range循环在接收完所有数据后会正常退出。 - 添加了
time.Sleep(2 * time.Second)以确保processJobsgoroutine 有足够时间完成处理。在实际应用中,你可能需要使用sync.WaitGroup或其他同步机制来等待 goroutine 完成。
如果你的程序需要发送多个作业,可以在发送完所有作业后再关闭通道。例如:
func main() {
jobs := make(chan int)
go processJobs(jobs)
// 发送多个作业到通道
for i := 1; i <= 5; i++ {
jobs <- i
}
// 关闭通道,通知接收方没有更多数据
close(jobs)
// 等待足够时间让 goroutine 完成处理
time.Sleep(6 * time.Second)
}
这样,processJobs 函数会处理所有作业,然后在通道关闭后退出循环,程序正常结束。

