如何杀死goroutine的执行?

通道具有关闭通道的关闭操作,因此无法在通道上进行发送操作。在关闭的通道上进行发送操作将导致恐慌。

在通道上执行接收操作时,我们检查通道是否关闭,如果通道关闭,则从goroutine退出。

package main

import (
	"fmt"
	"sync"
)

func main() {
	var wg sync.WaitGroup
	wg.Add(1)

	ch := make(chan string)
	go func() {
		for {
			channel, ok := <-ch
			if !ok {
				fmt.Println("Shut Down")
				defer wg.Done()
				return
			}
			fmt.Println(channel)
		}
	}()
	ch <- "Start"
	ch <- "Processing"
	ch <- "Finishing"
	close(ch)

	wg.Wait()
}

运行上面的程序时,您可以看到以下输出:


C:\Golang\goroutines>go run main.go
Start
Processing
Finishing
Shut Down

您必须阅读的解决方案

如何播放和暂停执行goroutine?

使用通道,我们可以播放和暂停执行goroutine。通道通过充当goroutine之间的管道来处理此通信。

如何等待Goroutine完成执行?

同步包的WaitGroup类型,用于等待程序完成从主函数启动的所有goroutine。它使用一个指定goroutine数量的计数器,并且Wait阻止程序执行,直到WaitGroup计数器为零。 Add方法用于将计数器添加到WaitGroup。 使用defer语句调度WaitGroup的Done方法,以减少WaitGroup计数器。 WaitGroup类型的Wait方法等待程序完成所有goroutine。 在主函数内部调用Wait方法,该函数将阻止执行,直到WaitGroup计数器的值为零为止,并确保所有goroutine都已执行。

What is goroutines?

高朗中的并发是功能彼此独立运行的能力。 Goroutine是可以同时运行的函数。 高朗提供Goroutines作为并发处理操作的一种方式。 新的goroutines由go语句创建。 要将函数作为goroutine运行,请调用以go语句为前缀的函数。这是示例代码块: sum()//一个正常的函数调用,它会同步执行sum并等待其完成 go sum()//一个goroutine,它异步执行sum而不等待完成它 go关键字使函数调用立即返回,而该函数作为goroutine开始在后台运行,而程序的其余部分继续执行。每个Golang程序的主要功能都是使用goroutine启动的,因此每个Golang程序至少运行一个goroutine。

如何在Golang中使用原子函数解决竞争条件?

争用条件是由于对共享资源的不同步访问而引起的,并试图同时读取和写入该资源。 原子函数提供了用于同步访问整数和指针的低级锁定机制。原子功能通常用于修复竞争条件。 同步包下的atomic中的函数通过锁定对共享资源的访问来提供支持同步goroutine的支持。

从Goroutines捕获值

从goroutine中获取值的最自然的方法是通道。通道是连接并发goroutine的管道。您可以将值从一个goroutine发送到通道,然后将这些值接收到另一个goroutine或在同步函数中。

如何在Golang中创建goroutine?

在每次调用函数responseSize之前添加了go关键字。三个responseSize goroutine程序同时启动,并且同时进行了三个对http.Get的调用。该程序不会等到一个响应返回后才发出下一个请求。结果,使用goroutines可以更快地打印出三种响应大小。

如何使用互斥锁定义代码的关键部分并解决竞争条件?

互斥锁用于在代码周围创建关键部分,以确保一次只能有一个goroutine可以执行该代码部分。