1. runtime.Gosched  让出CPU时间片,重新等待安排任务

package main

import (
"fmt"
"runtime"
) func main() {
go func(s string) {
for i :=0; i < 2; i++ {
fmt.Println(s)
runtime.Gosched() // 让出CPU时间片,重新等带安排任务
}
}("world") for i := 0; i < 2; i++ {
fmt.Println("hello")
runtime.Gosched() // 让出CPU时间片,重新等待安排任务
}
}

  

2. runtime.Goexit 退出当前协程

package main

import (
"fmt"
"runtime"
"sync"
) var wg sync.WaitGroup func main() {
wg.Add(1)
go func() {
defer wg.Done()
defer fmt.Println("A.defer")
func() {
defer fmt.Println("B.defer")
// 结束协程
runtime.Goexit()
defer fmt.Println("C.defer")
fmt.Println("B")
}()
fmt.Println("A")
}() wg.Wait() // 主goroutine等待子goroutine结束,主在结束
}

  

3. runtime.GOMAXPROCS  

Go运行时调度器使用runtime.GOMAXPROCS参数来确定需要使用多少个os线程来同时执行go代码,
默认值是机器上的CPU核心数量,例如一个8核心的机器上,调度器会把go代码同时调度到8个os线程上,
(GOMAXPROCS是m:n调度中的n)

go语言中可以通过runtime.GOMAXPROCS()函数来设置当前程序并发时占用的CPU逻辑核心数
go1.5版本之前默认使用的是单核心执行,1.5之后默认使用全部的cpu逻辑核心数

我们可以通过将任务分配到不同的CPU逻辑核心上,从而实现并行的效果

package main

import (
"fmt"
"runtime"
"sync"
"time"
) var wg sync.WaitGroup func a() {
defer wg.Done()
for i := 0; i < 100000000; i++ {
//fmt.Println("A", i)
}
}
func b() {
defer wg.Done()
for i := 0; i < 100000000; i++ {
//fmt.Println("B", i)
}
} func main() {
startTime := time.Now()
//runtime.GOMAXPROCS(1) // 设置go运行时(runtime)的os线程数
// runtime.GOMAXPROCS设置为1os线程数时执行时间要比4os线程数用时更长
runtime.GOMAXPROCS(4) // 设置go运行时(runtime)的os线程数
wg.Add(1)
go a()
wg.Add(1)
go b()
wg.Add(1)
go a()
wg.Add(1)
go b() wg.Wait()
fmt.Println(time.Now().Sub(startTime)) }

  运行结论:runtime.GOMAXPROCS设置为1os线程数时执行时间要比4os线程数用时更长

1os线程数执行时耗时:320ms左右,4os线程数执行耗时:160ms左右,不同系统运行时不太一样

因为: 1os线程数goroutine只能是并发执行,而4os线程数goroutine可以并行执行,所以快。

总结:

  runtime.Gosched() 让出cpu时间片,等待重新分配任务
  runtiem.Goexit() 退出协程
  runtime.GOMAXPROCS(i int) 执行go程序时对应的os线程数,即m:n中的n值

golang中的runtime包的更多相关文章

  1. golang中的reflect包用法

    最近在写一个自动生成api文档的功能,用到了reflect包来给结构体赋值,给空数组新增一个元素,这样只要定义一个input结构体和一个output的结构体,并填写一些相关tag信息,就能使用程序来生 ...

  2. golang中container/list包源码分析

    golang源码包中container/list实际上是一个双向链表 提供链表的一些基本操作,下面就结合定义和接口进行下说明 1. 定义 // Element is an element of a l ...

  3. golang中container/heap包源码分析

    学习golang难免需要分析源码包中一些实现,下面就来说说container/heap包的源码 heap的实现使用到了小根堆,下面先对堆做个简单说明 1. 堆概念 堆是一种经过排序的完全二叉树,其中任 ...

  4. golang中的rpc包用法

    RPC,即 Remote Procedure Call(远程过程调用),说得通俗一点就是:调用远程计算机上的服务,就像调用本地服务一样. 我所在公司的项目是采用基于Restful的微服务架构,随着微服 ...

  5. golang中的context包

    标准库的context包 从设计角度上来讲, golang的context包提供了一种父routine对子routine的管理功能. 我的这种理解虽然和网上各种文章中讲的不太一样, 但我认为基本上还是 ...

  6. golang中net/http包的简单使用

    一.介绍 http包提供了http客户端和服务端的实现 Get,Head,Post和PostForm函数发出http.https的请求 程序在使用完回复后必须关闭回复的主体 #简单的访问网站,由于没有 ...

  7. golang中os/exec包用法

    exec包执行外部命令,它将os.StartProcess进行包装使得它更容易映射到stdin和stdout,并且利用pipe连接i/o. 1.func LookPath(file string) ( ...

  8. golang 中的 time 包的 Ticker

    真实的应用场景是:在测试收包的顺序的时候,加了个 tick 就发现丢包了 那么来看一个应用例子: package main import ( "fmt" "runtime ...

  9. 关于Golang中database/sql包的学习

    go-sql-driver 请求一个连接的函数有好几种,执行完毕处理连接的方式稍有差别,大致如下: db.Ping() 调用完毕后会马上把连接返回给连接池. db.Exec() 调用完毕后会马上把连接 ...

随机推荐

  1. JAVA实现websocket客户端

    pom依赖 <dependency> <groupId>org.java-websocket</groupId> <artifactId>Java-We ...

  2. centos使用docker安装ActiveMQ

    拉取镜像 docker pull webcenter/activemq 启动镜像 docker run --name=activemq -itd -p 8161:8161 -p 61616:61616 ...

  3. dart系列之:dart优秀的秘诀-隔离机制

    目录 简介 dart中的隔离机制 生成一个Isolate Isolate之间的交互 一个例子 总结 简介 之前介绍了很多dart中的异步编程技巧,不知道大家有没有发现一个问题,如果是在java的异步编 ...

  4. java源码——对文件内容的查找和替换(开始写界面咯)

    问题是:"键盘输入文件的路径.查找内容和替换内容,对指定路径的文件的内容进行查找和替换." 好久没写界面了,今天熟悉一下界面的书写和监听器操作. 这个问题的本身不是很难,重点应该是 ...

  5. 【LeetCode】973. K Closest Points to Origin 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 小根堆 日期 题目地址:https://leetco ...

  6. 【LeetCode】910. Smallest Range II 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  7. 【LeetCode】1. Two Sum 两数之和

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人公众号:负雪明烛 本文关键词:two sum, 两数之和,题解,leetcode, 力 ...

  8. Java基础(八)——IO流1_字节流、字符流

    一.概述 1.介绍 I/O是 Input/Output 的缩写,IO流用来处理设备之间的数据传输,如读/写文件,网络通讯等.Java对数据的操作是通过流的方式进行.java.io 包下提供了各种&qu ...

  9. [C++]vector去除重复元素

    #include <iostream> #include <vector> #include <algorithm> #include <set> us ...

  10. Vue-cli3.0配置全局less

    第一种配置方式(推荐) npm install style-resources-loader vue-cli-plugin-style-resources-loader less-loader les ...