认识go协程

goroutine是Go语言实现并行处理的核心,它是一种轻量级的线程,占用内存小,便于提高CPU利用率和并发效率。然而,大量协程可能影响性能,甚至导致协程泄漏,通常与管道阻塞有关。创建goroutine只需在函数调用前加`go`关键字,主协程需确保其他协程有足够时间执行,如使用`time.Sleep`。
摘要由CSDN通过智能技术生成

go协程是什么?

go协程(goroutine)是go实现并行处理的核心,协程是比进程更小的单位。go语言内部为其实现了内存共享,执行goroutine只需要极少的栈内存(大概4-5kb),并且goroutine是由用户在go中直接调度使用的。与进程线程相比,它不需要CPU直接进行资源分配和调度管理,从而极大地减少了CPU的任务量,减轻了CPU的负担。

优势:

  1. 占用内存小,更轻便。
  2. 提高了CPU利用率和并发率,更高效。
  3. 用户态就可以调度使用,更易用。
  4. 减轻了CPU的负担。

缺点:

虽然在go中创建一个协程花销很小很容易,但如果内存里积累了成千上万个协程的话,还是会对性能有影响。可能导致协程泄漏。协程泄漏是因为我们不停的去创建协程,以为协程都会正常退出,而实际上协程阻塞到一直无法退出。根据实践来看,大部分的协程泄漏都和管道的阻塞有关系,比如试图从空管道中读数据,试图从满的管道中写数据。

简单示例:

只需在函数调用语句前添加go关键字,就可创建并发执行单元。开发人员无需了解任何执行细节,调度器会自动将其安排到合适的系统线程上执行。

package main

import (
	"fmt"
	"time"
)

func newTask() {
		fmt.Println("this is a newTask")
}

func main() {
	go newTask()//新建一个协程
	fmt.Println("this is a main goroutine")
	time.Sleep(time.Second)	
}

运行结果:
在这里插入图片描述
可以发现,主协程先执行,主协程之外的协程在主协程的基础上并发执行,不过一旦主协程退出,其他协程也强制退出。所以本例在主协程中添加了一个time.Sleep,用于延迟主协程时间,从而使其他协程执行完成。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值