Golang进程权限调度包runtime

2024-09-08 13:58

本文主要是介绍Golang进程权限调度包runtime,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

关于 runtime 包几个方法:

  • Gosched:让当前线程让出 cpu 以让其它线程运行,它不会挂起当前线程,因此当前线程未来会继续执行
  • GOMAXPROCS:设置最大的可同时使用的 CPU 核数
  • Goexit:退出当前 goroutine(但是defer语句会照常执行)
  • NumGoroutine:返回正在执行和排队的任务总数
  • GOOS:目标操作系统
  • NumCPU:返回当前系统的 CPU 核数量
package mainimport ("fmt""runtime"
)func main() {fmt.Println("cpus:", runtime.NumCPU())fmt.Println("goroot:", runtime.GOROOT())fmt.Println("archive:", runtime.GOOS)
}

runtime.Gosched()

用于让出CPU时间片,让出当前goroutine的执行权限,调度器安排其它等待的任务运行,并在下次某个时候从该位置恢复执行。这就像跑接力赛,A跑了一会碰到代码runtime.Gosched()就把接力棒交给B了,A歇着了,B继续跑。

没有使用Gosched函数:

package main
import ("fmt"
)func main() {go func() { //子协程   //没来的及执行主进程结束for i := 0; i < 5; i++ {fmt.Println("go")}}()for i := 0; i < 2; i++ { //默认先执行主进程主进程执行完毕fmt.Println("hello")}
}
hello
hello

使用Gosched函数:

package main
import ("fmt""runtime"
)func main() {go func() {  //让子协程先执行for i := 0; i < 5; i++ {fmt.Println("go")}}()for i := 0; i < 2; i++ {//让出时间片,先让别的协议执行,它执行完,再回来执行此协程runtime.Gosched()fmt.Println("hello")}
}
go
go
go
go
go
hello
hello

runtime.Goexit()

调用此函数会立即使当前的goroutine的运行终止(终止协程),而其它的goroutine并不会受此影响。runtime.Goexit在终止当前goroutine前会先执行此goroutine的还未执行的defer语句。请注意千万别在主函数调用runtime.Goexit,因为会引发panic。

package mainimport ("fmt""runtime"
)func test() {defer fmt.Println("ccccccccccccc")//return //终止此函数runtime.Goexit() //终止所在的协程fmt.Println("dddddddddddddddddddddd")
}func main() {//创建新建的协程go func() {fmt.Println("aaaaaaaaaaaaaaaaaa")//调用了别的函数test()fmt.Println("bbbbbbbbbbbbbbbbbbb")}() //别忘了()//特地写一个死循环,目的不让主协程结束for {}
}
aaaaaaaaaaaaaaaaaa
ccccccccccccc

runtime.GOMAXPROCS()

用来设置可以并行计算的CPU核数最大值,并返回之前的值。

默认此函数的值与CPU逻辑个数相同,即有多少个goroutine并发执行,当然可以设置它,它的取值是1~256。最好在主函数在开始前设置它,因为设置它会停止当前程序的运行。

GO默认是使用一个CPU核的,除非设置runtime.GOMAXPROCS
那么在多核环境下,什么情况下设置runtime.GOMAXPROCS会比较好的提高速度呢?

适合于CPU密集型、并行度比较高的情景。如果是IO密集型,CPU之间的切换也会带来性能的损失。

package mainimport ("fmt""runtime"
)func main() {//n := runtime.GOMAXPROCS(1) //指定以1核运算n := runtime.GOMAXPROCS(4) //指定以4核运算fmt.Println("n = ", n)for {go fmt.Print(1)fmt.Print(0)}
}

参考地址:Golang进程权限调度包runtime三大函数Gosched、Goexit、GOMAXPROCS

这篇关于Golang进程权限调度包runtime的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1148304

相关文章

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

搭建Kafka+zookeeper集群调度

前言 硬件环境 172.18.0.5        kafkazk1        Kafka+zookeeper                Kafka Broker集群 172.18.0.6        kafkazk2        Kafka+zookeeper                Kafka Broker集群 172.18.0.7        kafkazk3

[Linux]:进程(下)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:Linux学习 贝蒂的主页:Betty’s blog 1. 进程终止 1.1 进程退出的场景 进程退出只有以下三种情况: 代码运行完毕,结果正确。代码运行完毕,结果不正确。代码异常终止(进程崩溃)。 1.2 进程退出码 在编程中,我们通常认为main函数是代码的入口,但实际上它只是用户级

java 进程 返回值

实现 Callable 接口 与 Runnable 相比,Callable 可以有返回值,返回值通过 FutureTask 进行封装。 public class MyCallable implements Callable<Integer> {public Integer call() {return 123;}} public static void main(String[] args

C#关闭指定时间段的Excel进程的方法

private DateTime beforeTime;            //Excel启动之前时间          private DateTime afterTime;               //Excel启动之后时间          //举例          beforeTime = DateTime.Now;          Excel.Applicat

linux中使用rust语言在不同进程之间通信

第一种:使用mmap映射相同文件 fn main() {let pid = std::process::id();println!(

一种改进的red5集群方案的应用、基于Red5服务器集群负载均衡调度算法研究

转自: 一种改进的red5集群方案的应用: http://wenku.baidu.com/link?url=jYQ1wNwHVBqJ-5XCYq0PRligp6Y5q6BYXyISUsF56My8DP8dc9CZ4pZvpPz1abxJn8fojMrL0IyfmMHStpvkotqC1RWlRMGnzVL1X4IPOa_  基于Red5服务器集群负载均衡调度算法研究 http://ww

Golang 网络爬虫框架gocolly/colly(五)

gcocolly+goquery可以非常好地抓取HTML页面中的数据,但碰到页面是由Javascript动态生成时,用goquery就显得捉襟见肘了。解决方法有很多种: 一,最笨拙但有效的方法是字符串处理,go语言string底层对应字节数组,复制任何长度的字符串的开销都很低廉,搜索性能比较高; 二,利用正则表达式,要提取的数据往往有明显的特征,所以正则表达式写起来比较简单,不必非常严谨; 三,使

Golang网络爬虫框架gocolly/colly(四)

爬虫靠演技,表演得越像浏览器,抓取数据越容易,这是我多年爬虫经验的感悟。回顾下个人的爬虫经历,共分三个阶段:第一阶段,09年左右开始接触爬虫,那时由于项目需要,要访问各大国际社交网站,Facebook,myspace,filcker,youtube等等,国际上叫得上名字的社交网站都爬过,大部分网站提供restful api,有些功能没有api,就只能用http抓包工具分析协议,自己爬;国内的优酷、

Golang网络爬虫框架gocolly/colly(三)

熟悉了《Golang 网络爬虫框架gocolly/colly 一》和《Golang 网络爬虫框架gocolly/colly 二》之后就可以在网络上爬取大部分数据了。本文接下来将爬取中证指数有限公司提供的行业市盈率。(http://www.csindex.com.cn/zh-CN/downloads/industry-price-earnings-ratio) 定义数据结构体: type Zhj