Go中的Goroutine和main Goroutine,阻塞以及非阻塞操作

目录

Go的main函数和Goroutine的关系

理解Go的阻塞和非阻塞操作

阻塞(Blocking)

非阻塞(Non-blocking)


        main函数本身也是一个Goroutine。
        在Go语言中,main函数是程序的入口点。当程序启动时,Go运行时会创建一个名为main的Goroutine,并在其中执行main函数的代码。这个main Goroutine 是程序中的主要执行线程,它负责执行main函数中的指令和操作。
        与其他用户创建的Goroutine类似,main Goroutine 也是并发执行的。它可以与其他Goroutine同时执行,利用多核处理器的并行性。
        main Goroutine 的生命周期与程序的生命周期相同。当main函数执行完成或显式调用os.Exit函数终止程序时,main Goroutine 会随之结束。其他正在执行的Goroutine也会被终止,程序会退出。
        因此,我们可以把main函数看作是程序中的一个特殊的Goroutine,它是程序的入口和控制中心。通过在main函数内部启动其他Goroutine,我们可以实现多个任务的并发执行,充分利用Go语言的并发能力。

        Go语言中,阻塞和非阻塞是用来描述对某个操作的等待行为的。
        阻塞(Blocking):当执行一个操作时,如果该操作无法立即完成,程序会被阻塞,即暂停执行,直到该操作完成或满足某个条件。在阻塞状态下,程序无法继续执行其他任务,直到阻塞的操作完成。例如,当我们读取一个通道(channel)时,如果通道中没有可读取的数据,读取操作将会阻塞,直到有数据可读。

package main

import (
	"fmt"
	"time"
)

func main() {
	ch := make(chan int) // 创建一个通道

	go func() {
		time.Sleep(2 * time.Second)
		ch <- 42 // 向通道发送数据
	}()

	fmt.Println("Waiting for data...")
	data := <-ch // 从通道接收数据,如果通道中没有数据,该行会阻塞等待
	fmt.Println("Received data:", data)
}

        在上述示例中,我们创建了一个通道ch,并在一个Goroutine中等待2秒后向通道发送了数据(你可以尝试修改time.Sleep函数后的数字,分别运行来看效果)。在主Goroutine中,我们尝试从通道ch中接收数据。由于通道中没有数据可用,接收操作会被阻塞,直到数据发送到通道为止。

        非阻塞(Non-blocking):当执行一个操作时,如果该操作无法立即完成,程序不会被阻塞,而是立即返回,不管操作是否成功或者完成。通过使用非阻塞操作,程序可以继续执行其他任务,而不需要等待阻塞的操作完成。例如,使用非阻塞的方式读取通道时,如果通道中没有数据可读,读取操作会立即返回一个错误或默认值。

package main

import (
	"fmt"
	"time"
)

func main() {
	ch := make(chan int) // 创建一个通道

	go func() {
		time.Sleep(2 * time.Second)
		ch <- 42 // 向通道发送数据
	}()

	fmt.Println("Waiting for data...")
	select {
	case data := <-ch: // 尝试从通道接收数据
		fmt.Println("Received data:", data)
	default:
		fmt.Println("No data available")
	}
}

        在上述示例中,我们使用select语句来尝试从通道ch中接收数据。如果通道中没有可用的数据,select语句会立即执行default分支,输出"No data available",而不会阻塞等待。这样,程序可以继续执行其他任务,而不需要等待数据的到达。

        阻塞和非阻塞是用来描述对于某个操作的等待行为的概念。阻塞表示当一个操作无法立即完成时,程序会暂停执行,直到操作完成。非阻塞表示当一个操作无法立即完成时,程序会立即返回,继续执行其他任务。在Go语言中,通常使用通道操作来展示阻塞和非阻塞的概念。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

vSeanere

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值