一看就懂系列之Golang的goroutine和通道

https://blog.csdn.net/u011957758/article/details/81159481

前言

如果说php是最好的语言,那么golang就是最并发的语言。
支持golang的并发很重要的一个是goroutine的实现,那么本文将重点围绕goroutine来做一下相关的笔记,以便日后快速留恋。

10s后,以下知识点即将靠近:

1.从并发模型说起
2.goroutine的简介
3.goroutine的使用姿势
4.通道(channel)的简介
5.重要的四种通道使用
6.goroutine死锁与处理
7.select的简介
8.select的应用场景
9.select死锁

正文

1.从并发模型说起

看过很多大神简介,各种研究高并发,那么就通俗的说下并发。
并发目前来看比较主流的就三种:

1.多线程

每个线程一次处理一个请求,线程越多可并发处理的请求数就越多,但是在高并发下,多线程开销会比较大。

2.协程

无需抢占式的调度,开销小,可以有效的提高线程的并发性,从而避免了线程的缺点的部分

3.基于异步回调的IO模型

说一个熟悉的,比如nginx使用的就是epoll模型,通过事件驱动的方式与异步IO回调,使得服务器持续运转,来支撑高并发的请求


为了追求更高效和低开销的并发,golang的goroutine来了。

2.goroutine的简介

定义:在go里面,每一个并发执行的活动成为goroutine

详解:goroutine可以认为是轻量级的线程,与创建线程相比,创建成本和开销都很小,每个goroutine的堆栈只有几kb,并且堆栈可根据程序的需要增长和缩小(线程的堆栈需指明和固定),所以go程序从语言层面支持了高并发。

程序执行的背后:当一个程序启动的时候,只有一个goroutine来调用main函数,称它为主goroutine,新的goroutine通过go语句进行创建。

3.goroutine的使用姿势

3.1单个goroutine创建

在函数或者方法前面加上关键字go,即创建一个并发运行的新goroutine。

上代码:

package main

import (
	"fmt"
	"time"
)

func HelloWorld() {
	fmt.Println("Hello world goroutine")
}

func main() {
	go HelloWorld()      // 开启一个新的并发运行
	time.Sleep(1*time.Second)
	fmt.Println("我后面才输出来")
}

以上执行后会输出:

Hello world goroutine
我后面才输出来

需要注意的是,执行速度很快,一定要加sleep,不然你一定可以看到goroutine里头的输出。

这也说明了一个关键点:当main函数返回时,所有的gourutine都是暴力终结的,然后程序退出。

3.2多个goroutine创建

package main

import (
	"fmt"
	"time"
)

func DelayPrint() {
	for i := 1; i <= 4; i++ {
		time.Sleep(250 * time.Millisecond)
		fmt.Println(i)
	}
}

func HelloWorld() {
	fmt.Println("Hello world goroutine")
}

func main() {
	go DelayPrint()    // 开启第一个goroutine
	go HelloWorld()    // 开启第二个goroutine
	time.Sleep(2*time.Second)
	fmt.Println("main function")
}

函数输出:

Hello world goroutine
1
2
3
4
5
main function
  • 57
    点赞
  • 191
    收藏
    觉得还不错? 一键收藏
  • 16
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值