Go关键字--go

栏目: Go · 发布时间: 6年前

内容简介:轻松开启高并发,一直都是golang语言引以为豪的功能点。golang通过goroutine实现高并发,而开启goroutine的钥匙正是go关键字。开启并发执行的语法格式是:在调用函数后,只需要在被调用的函数前边加上go关键字,就可以轻松的开启并发执行。下边请看示例代码:输出信息:

友情推广

Go关键字--go

轻松开启高并发,一直都是golang语言引以为豪的功能点。golang通过goroutine实现高并发,而开启goroutine的钥匙正是 go 关键字。开启并发执行的语法格式是:

go  funcName()

在调用函数后,只需要在被调用的函数前边加上go关键字,就可以轻松的开启并发执行。下边请看示例代码:

package main

import (
	"fmt"
	"time"
)

// goroutine1 函数,循环内部每隔一秒钟打印一次总共执行次数
func goroutine1() {
	var idx = 0
	for {
		idx++
		fmt.Println("goroutine 1,执行第", idx, "次")
		
		// 睡眠等待1秒
		time.Sleep(time.Second * 1)
	}
}

// goroutine2 函数,循环内部每隔一秒钟打印一次总共执行次数
func goroutine2() {
	var idx = 0
	for {
		idx++
		fmt.Println("goroutine 2,执行第", idx, "次")
		
		// 睡眠等待1秒
		time.Sleep(time.Second * 1)
	}
}

func main() {
	fmt.Println("main function")

	// 开启并发执行
	go goroutine1()
	go goroutine2()

	// 主函数中等待goroutine执行,如果主函数退出,goroutine将全部退出
	for {
	}
}

输出信息:

goroutine 1,执行第 1 次
goroutine 2,执行第 1 次
goroutine 2,执行第 2 次
goroutine 1,执行第 2 次
goroutine 1,执行第 3 次
goroutine 2,执行第 3 次
......

上边的示例代码中,定义了两个函数分别是goroutine1和goroutine2,这两个函数在调用时,使用go关键字启动并发执行。开启并发执行后,goroutine1和goroutine2由调度器调度执行,至于谁先执行谁后执行,如果任务优先级相同,则两个任务随机执行,没有明确的先后顺序。

并发执行

单核处理器时代,从微观上将,一个瞬时点上,处理器上只有一条指令在执行,而每一个进程都是一堆指令的集合,所以,处理器在一个瞬时点上,只可能执行一个进程。假设一下,现在有一家网红店,有很多顾客排队购买网红产品,排在第一的顾客才能购买产品。这家店有20种非常畅销的产品,但是老板规定每人每次只能购买一件产品,如果想要购买其它产品,就要重新排队。所以,在一个时点上,只会存在一个客户在购买产品,如果把这个流程速度提高1亿倍,处理器就是网红店老板,排队顾客就是任务。每个任务是否执行完成,取决于每个顾客想要购买几款产品。任务的并发就是这么个流程。

并行执行

还是上述的顾客购买网红产品的例子,如果老板担心顾客排队时间过长,会导致顾客流失,影响店里销售情况,于是老板新招了一批服务员,将排队窗口扩展至8个。这8个队列之间互相没有干扰。顾客的选择方位变广了,有8个队列可以进行排队,与以前一个窗口排队相比,现在购买产品的速度就提高了,再次把这个流程的速度提高1亿倍,老板仍然是处理器,每一个服务窗口就是一个核心,那么这就是一颗8核心处理器了,假如现在只有8个顾客排队,那么就可以每人占有一个服务窗口,8个顾客之间互相不影响,这就是多核处理器时代并行执行的概念。

设置CPU核数

golang的goroutine默认情况下使用单核运行,开启多核运行的方法是使用runtime包中的GOMAXPROCS函数设置核心数.

runtime.GOMAXPROCS(8)

将默认值设置成8,表示默认开启8个CPU核心,但是这种写法很显然过于死板,万一是32核心处理器了,开启8个核心不是浪费。在程序中获取处理器核心的方法是:

var num = runtime.NumCPU()

num变量将会保存CPU核心数量。

在goroutine中怎么退出

在goroutine退出执行的方法是执行下边函数调用:

runtime.Goexit()

出让时间片

如果goroutine中发现运行条件还不完善,想要等待一下再执行怎么办?使用出让时间片函数,让出当前goroutine对cpu的占用,调用函数是:

runtime.Gosched()

查询执行中和排队中的goroutine

调用下边函数查询:

var runningNum = runtime.NumGoroutine()

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

How to Design Programs, 2nd Edition

How to Design Programs, 2nd Edition

Matthias Felleisen、Robert Bruce Findler、Matthew Flatt、Shriram Krishnamurthi / MIT Press / 2018-5-4 / USD 57.00

A completely revised edition, offering new design recipes for interactive programs and support for images as plain values, testing, event-driven programming, and even distributed programming. This ......一起来看看 《How to Design Programs, 2nd Edition》 这本书的介绍吧!

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具