GO语言网络编程(并发编程)runtime包

2023-10-27

GO语言网络编程(并发编程)runtime包

1. runtime包

1.1.1. runtime.Gosched()

让出CPU时间片,重新等待安排任务(大概意思就是本来计划的好好的周末出去烧烤,但是你妈让你去相亲,两种情况第一就是你相亲速度非常快,见面就黄不耽误你继续烧烤,第二种情况就是你相亲速度特别慢,见面就是你侬我侬的,耽误了烧烤,但是还馋就是耽误了烧烤你还得去烧烤)

package main

import (
    "fmt"
    "runtime"
)

func main() {
    go func(s string) {
        for i := 0; i < 2; i++ {
            fmt.Println(s)
        }
    }("world")
    // 主协程
    for i := 0; i < 2; i++ {
        // 切一下,再次分配任务
        runtime.Gosched()
        fmt.Println("hello")
    }
}

1.1.2. runtime.Goexit()

退出当前协程(一边烧烤一边相亲,突然发现相亲对象太丑影响烧烤,果断让她滚蛋,然后也就没有然后了)

package main

import (
    "fmt"
    "runtime"
)

func main() {
    go func() {
        defer fmt.Println("A.defer")
        func() {
            defer fmt.Println("B.defer")
            // 结束协程
            runtime.Goexit()
            defer fmt.Println("C.defer")
            fmt.Println("B")
        }()
        fmt.Println("A")
    }()
    for {
    }
}

1.1.3. runtime.GOMAXPROCS

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

Go语言中可以通过runtime.GOMAXPROCS()函数设置当前程序并发时占用的CPU逻辑核心数。

Go1.5版本之前,默认使用的是单核心执行。Go1.5版本之后,默认使用全部的CPU逻辑核心数。

我们可以通过将任务分配到不同的CPU逻辑核心上实现并行的效果,这里举个例子:

func a() {
    for i := 1; i < 10; i++ {
        fmt.Println("A:", i)
    }
}

func b() {
    for i := 1; i < 10; i++ {
        fmt.Println("B:", i)
    }
}

func main() {
    runtime.GOMAXPROCS(1)
    go a()
    go b()
    time.Sleep(time.Second)
}

两个任务只有一个逻辑核心,此时是做完一个任务再做另一个任务。 将逻辑核心数设为2,此时两个任务并行执行,代码如下。

func a() {
    for i := 1; i < 10; i++ {
        fmt.Println("A:", i)
    }
}

func b() {
    for i := 1; i < 10; i++ {
        fmt.Println("B:", i)
    }
}

func main() {
    runtime.GOMAXPROCS(2)
    go a()
    go b()
    time.Sleep(time.Second)
}

Go语言中的操作系统线程和goroutine的关系:

1.一个操作系统线程对应用户态多个goroutine。

2.go程序可以同时使用多个操作系统线程。

3.goroutine和OS线程是多对多的关系,即m:n。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GO语言网络编程(并发编程)runtime包 的相关文章

  • 如何将 int[] 转换为 uint8[]

    所以 我需要你的帮助 我找不到关于该主题的任何内容 Golang 是一门刚刚诞生的语言 所以对于像我这样的新手来说很难快速找到答案 预先声明的 Goint类型大小是特定于实现的 32 位或 64 位 数字类型 http golang org
  • 复杂数据类型作为 Go 中映射的键

    我正在尝试在 Go 中创建一个由大整数作为键的映射 effective Go 明确指出 结构体 数组和切片不能用作映射键 因为这些类型上没有定义相等性 这是有道理的 我当然可以将大整数转换为字符串并使用字符串作为键 但我在这里寻找更通用的解
  • 有队列实现吗?

    任何人都可以建议使用 Go 容器来实现简单快速的 FIF 队列 Go 有 3 种不同的容器 heap list and vector 哪一种更适合实现队列 事实上 如果您想要的是一个基本且易于使用的 fifo 队列 slice 可以满足您所
  • 正确的文件扩展名或缩写是什么。 golang 的文本/模板?

    我正在考虑为其创建语法荧光笔 但我不知道这种特定类型模板的常规缩写 In 例子之一 http golang org pkg text template example Template helpers从文本 模板 godoc 中 它们引用
  • Golang:带有 JSON 负载的 http.NewRequest POST 返回错误 500

    我正在开发一个 API 库 有一个API端点 POST 当您发出curl命令时 它是 curl H X API TOKEN API TOKEN http interest graph getprismatic com text topic
  • 在 Go 中,如何将结构体转换为字节数组?

    我有一个我定义的结构实例 我想将其转换为字节数组 我尝试了 byte my struct 但这不起作用 另外 我还被指出二进制包 http golang org pkg encoding binary 但我不确定我应该使用哪个函数以及应该如
  • 如何从 JWT 令牌中提取声明

    我正在使用 dgrijalva jwt go 包 我想从令牌中提取有效负载 但找不到方法 示例 取自 https jwt io https jwt io 对于编码 eyJhbGciOiJIUZI1NiIsInR5cCI6IkpXVCJ9 e
  • 如何使用 GOPATH 的 Samba 服务器位置?

    我正在尝试将 GOPATH 设置为共享网络文件夹 当我进入 export GOPATH smb path to shared folder I get go GOPATH entry is relative must be absolute
  • 如何将接口转换为接口切片?

    我的输入是interface 而且我知道它可以是任何类型的数组 我想读取我输入的元素之一 所以我尝试将我的interface 进入一个 interface 但是 go 会给我以下错误 恐慌 接口转换 interface 是 map stri
  • 错误:标准包中非标准导入“gopkg.in/yaml.v2”

    我正在尝试从以下位置导入 go yamlhttps github com go yaml yaml https github com go yaml yaml 并且我发现了一个 Google 没有提供帮助的错误 I ran go get g
  • 实现具有更广泛方法签名的接口

    在Go中 是否有一种方法可以使用方法来实现接口 其中实现中相应方法的返回类型 比 预期返回类型 更宽 这很难解释 所以这里有一个例子 在 Go Playground 中运行以下示例代码时出现此错误 prog go 36 14 cannot
  • Go客户端程序生成大量TIME_WAIT状态的socket

    我有一个 Go 程序 它从多个 goroutine 生成大量 HTTP 请求 运行一段时间后 程序报错 connect cannot allocaterequestedaddress 当检查时netstat 我得到大量 28229 个连接T
  • golang.org 包和标准库之间的区别

    我使用 go 已经有一段时间了 我注意到 Go 标准库 和 golang org x 之间存在重复的包 我的问题是 为什么它们被释放两次 在这两者中 我应该使用哪一个 更新的 规范的等 到目前为止我注意到的一些示例包已发布两次 golang
  • 将产生 goroutine 的 golang 方法

    据我所知 如果 goroutine 太忙 它们会阻止其他 goroutine 运行 对我来说 这意味着我的应用程序的性能和响应能力可能取决于我知道哪些库方法将控制其他 goroutine 例如通常是 Read 和 Write 有什么方法可以
  • Facebook服务器端登录、CORS

    我正在实现一个带有 FB 服务器端登录的网站 简化步骤如下 一个简单的按钮触发 JS 脚本 该脚本调用我的后端 APIhttps localhost fblogin function sendFbLoginData get https lo
  • 如何对结构切片而不是切片结构进行范围调整

    稍微玩了一下 Go HTML 模板后 我发现的所有循环模板中对象的示例都是将切片结构传递给模板 有点像这个示例 type UserList struct Id int Name string var templates template M
  • 如何读取 UDP 连接直至超时?

    我需要读取 UDP 流量 直到超时 我可以通过在 UDPConn 上调用 SetDeadline 并循环直到出现 I O 超时错误来做到这一点 但这看起来很黑客 基于错误条件的流量控制 下面的代码片段看起来更正确 但并没有终止 在生产中 这
  • 共享 GOPATH 的良好做法是什么?

    我刚刚开始学习 Go 并阅读现有代码以了解 其他人是如何做的 在这样做时 go 工作空间 的使用 特别是当它与项目的依赖项相关时 似乎无处不在 在处理各种 Go 项目时 使用单个或多个 Go 工作区 即 GOPATH 的定义 的常见最佳实践
  • 使用生成的 Golang DLL 返回字符串或 *C.Char

    我一直在努力追随z505 goDLL https github com z505 goDLL回购并遇到了一个大问题 该方法无法返回字符串 我无法读取结果的输出变量 这是我到目前为止使用的代码 Go 完整代码https play golang
  • 重新设计循环依赖缺陷

    我有一堆小服务 它们共享一些常见的包 例如Logger Configuration and Net 我在单独的项目中编写了每个包 问题是我的Logger需求包Configuration用于设置 和我的Configuration not仅由L

随机推荐

  • 小米笔记本pro开机出现no bootable devices

    用了4个月的小米笔记本开机突然出现no bootable devices 无法正常启动 很烦 如下图 上网查了资料 说是无法正确识别硬盘 然后 小米论坛的朋友 也有反馈 说很他们的小米笔记本也都出现了类似的情况 至今没有找到解决的方法 这可
  • 51单片机AD模数转换(SPI通信)

    一 AD DA介绍 AD AnalogtoDigital 模拟 数字转换 将模拟信号转换为计算机可操作的数字信号 DA Digital to Analog 数字 模拟转换 将计算机输出的数字信号转换为模拟信号 AD DA转换打开了计算机与模
  • python pandas定位表格中的某一单元并修改——at

    python pandas定位表格中的某一单元并修改 at 首先 我们创造一个用来进行测试的dataframe import pandas data aaa abc1 abc2 bbb bc1 bc2 ccc c1 c2 df pandas
  • Nacos安装详细过程

    本文来说下Nacos 注册中心 配置中心 安装详细过程 文章目录 初识Nacos Nacos开发必知 安装Nacos 本文小结 初识Nacos Nacos 致力于帮助您发现 配置和管理微服务 Nacos 提供了一组简单易用的特性集 帮助您快
  • 【转】介绍线性代数

    color red 这里转一个别人写的对线性代数的理解 觉得他已经写出了线性代数的魂 可惜的是我也是从网上别人的转载中摘录的 未知作者的大名啊 color 今天先谈谈对线形空间和矩阵的几个核心概念的理解 这些东西大部分是凭着自己的理解写出来
  • Canvas画布基本功能及实现网页签名功能

    canvas 简介
  • C++之泛型编程

    目录 模板 模板的特点 函数模板 前言 函数模板的使用方式 函数模板具体案例 使用模板的注意事项 普通函数与函数模板间的区别 具体案例 普通函数与函数模板调用规则 模板的局限性 具体化模板 类模板 前言 类模板与函数模板的区别 类模板中成员
  • JS URL的编码解码以及使用场景

    前端事件交互 有的时候会用到url作为参数 然而你会发现直接把url当个字符串来处理会发现有很多的局限性 比如说我想添加一个参数什么的 或者进行个解析比较麻烦 而且有的时候解析url有的时候因为特殊符号什么的也是个问题 于是有了JS的url
  • STDCnetwork BiSeNet 的实时语义分割的rethinking

    STDCnetwork Rethinking BiSeNet For Real time Semantic Segmentation重新思考 BiSeNet 的实时语义分割 BiSeNet 28 27 已被证明是一种流行的用于实时分割的双流
  • 关于新手Myeclipse(最新V2019.12.5) 第一次创建web project,运行JSP,详细步骤,所遇到的问题及解决方案。

    Myeclipse 创建web project 运行JSP 详细步骤 具体Myeclipse的安装及环境配置我不再赘述 我在这里用的Myeclipse的版本为V2019 12 5 打开Myeclipse 创建一个新的Workspaces 点
  • 一文读懂微生物扩增子16s测序

    微生物多样性测序结果如何看 做过16s测序的小伙伴们都知道 测完之后会拿到一份结果报告 但这并不代表可以开始写文章了 看似一大堆数据图表却不知如何下手 这是很多人头疼的地方 那么怎样给报告中的数据赋予灵魂 让它真正成为对你有帮助的分析呢 一
  • 一起来用Websocket(一)开篇 Websocket!Socket在HTML5复活

    注 本文源代码点此下载 一起来用websocket 一 开篇 websocket socket在html5复活 前言 html5中有一个比较好用的特性 就是websocket 现在已集成在chrome的较新版本中 由于前段时间在项目中有用到
  • 《计算机网络》——第五章知识点

    可靠 保证接收方进程从缓存区读出的字节流与发送方发出的字节流是完全一样的 确认重传不分家 TCP的发送方在规定的时间内没有收到确认就要重传已发送的报文段 流量控制 让发送方慢点 要让接收方来得及接收 TCP利用滑动窗口机制实现流量控制 在通
  • SpringBoot项目引入jar包

    在项目过程中 有时候需要引入本地的jar包 比如企业自己的jar包或者修改过的源码包 有两种方法可以使用 一 本地maven库 把jar包打到本地maven库 然后在pom文件中加上依赖 把jar和pom文件打到maven库的命令 mvn
  • Mybatis批量操作

    当下Java开发中 数据库操作多采用Mybatis框架 它支持定制化 SQL 存储过程以及高级映射 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集 很多时候 我们需要进行大量的数据操作 如果通过循环去逐个操作 这样会导致多次请
  • 大大大模型部署方案抛砖引玉

    作者 Oldpan 编辑 oldpan博客 点击下方卡片 关注 自动驾驶之心 公众号 ADAS巨卷干货 即可获取 点击进入 自动驾驶之心 模型部署 技术交流群 借着热点 简单聊聊大模型的部署方案 作为一个只搞过CV部署的算法工程师 在最近L
  • 想找一家好公司入职或者合作?那么这块天眼查GUI版本非常适合你。

    前言 天眼查是咱们都知道的一个网站了 就是可以通过这个网站来知道咱们想了解公司的一些情况 比如是不是濒临破产 有没有什么法律纠纷 所以今天在找合作公司的时候 就突发奇想的想着写一个天眼查的gui脚本 大家喜欢的话可以拿走练练手 开发工具 P
  • STM32学习笔记---电源管理

    一 STM32电源管理简介 1 电源管理简介 电源对电子设备的重要性不言而喻 它是保证系统稳定运行的基础 而保证系统能稳定运行后 又有低功耗的要求
  • web app和本地app之争 及其 iOS和Android之争

    2011年末的文章 当时还在学校 没有发表 今天贡献出来 今天和 1 我觉得你说其实是web app和本地app之争 我原来也看过别人讨论 我觉得这个看法好 如果以后多种平台并存 比如Ios Android wmphone bb 那么显然w
  • GO语言网络编程(并发编程)runtime包

    GO语言网络编程 并发编程 runtime包 1 runtime包 1 1 1 runtime Gosched 让出CPU时间片 重新等待安排任务 大概意思就是本来计划的好好的周末出去烧烤 但是你妈让你去相亲 两种情况第一就是你相亲速度非常