Skip to content

Goroutine泄露问题——交替打印数字和字母 #69

@zhazhalaila

Description

@zhazhalaila

Goroutine是如何泄露的

在交替打印数字和字母的解法里面,负责打印字母的goroutine可以正常退出,但是负责打印数字的goroutine是一个死循环,因此示例代码存在泄露goroutine的风险

	go func() {
		i := 1
		for {
			select {
			case <-number:
				fmt.Print(i)
				i++
				fmt.Print(i)
				i++
				letter <- true
			}
		}
	}()

解决办法

负责打印字母的goroutine在退出时可以执行close(number)告知打印数字的goroutine退出

package main

import (
	"fmt"
	"sync"
)

func main() {
	letter, number := make(chan bool), make(chan bool)
	wg := sync.WaitGroup{}

	wg.Add(1)
	go func() {
		defer func() {
			fmt.Println("\nNumber goroutine exit.")
			wg.Done()
		}()
		i := 1
		for range number {
			fmt.Print(i)
			i++
			fmt.Print(i)
			letter <- true
		}
	}()

	wg.Add(1)
	go func(wg *sync.WaitGroup) {
		defer func() {
			close(number)
			fmt.Println("\nLetter goroutine exit.")
			wg.Done()
		}()
		i := 'A'
		for range letter {
			if i >= 'Z' {
				return
			}

			fmt.Print(string(i))
			i++
			fmt.Print(string(i))
			i++
			number <- true
		}
	}(&wg)

	number <- true
	wg.Wait()
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions