Go语言的并发和并行

Go 语言并发模型解析 作者:禅与计算机程序设计艺术 1.简介 1.什么是 Go 语言 Go 语言(官网):https://golang.org/ Go 是 Google 开发的一个开源编程语言,它的设计哲学在 阅读详情
package main

import (
    "fmt"
)

func loop(done chan bool) {
    for i := 0; i < 10; i++ {
        fmt.Print(i)
    }
    done <- true
}

func main() {
    done := make(chan bool)
    go loop(done)
    go loop(done)

    <-done
    <-done

}
复制代码

他的输出结果: 01234567890123456789

go不是会新起一个goroutine来运行loop函数吗。以前我们用线程去做类似任务的时候,系统的线程会抢占式地输出, 表现出来的是乱序地输出。而goroutine为什么是这样输出的呢?

 

关于并行和并发,下面这张图说明:

 

  • 两个队列,一个Coffee机器,那是并发
  • 两个队列,两个Coffee机器,那是并行

默认地, Go所有的goroutines只能在一个线程里跑 。

如果当前goroutine不发生阻塞,它是不会让出CPU给其他goroutine的, 所以上面的例子的输出会是一个一个goroutine进行的

 

真正的并行

为了达到真正的并行,runtime.GOMAXPROCS(2)试试看

复制代码
package main

import (
    "fmt"
    "runtime"
)

func loop(done chan bool) {
    for i := 0; i < 100; i++ {
        fmt.Printf("%d ", i)
    }
    done <- true
}

func main() {
    runtime.GOMAXPROCS(2)
    done := make(chan bool)
    go loop(done)
    go loop(done)

    <-done
    <-done

}
复制代码

这下会看到两个goroutine会抢占式地输出数据了。我们还可以这样显式地让出CPU时间:

复制代码
package main

import (
    "fmt"
    "runtime"
)

func loop(done chan bool) {
    for i := 0; i < 100; i++ {
        fmt.Printf("%d ", i)
        runtime.Gosched()  //// 显式地让出CPU时间给其他goroutine
    }
    done <- true
}

func main() {
    // runtime.GOMAXPROCS(2)
    done := make(chan bool)
    go loop(done)
    go loop(done)

    <-done
    <-done

}
复制代码

总结

我们从例子中可以看到,默认的, 所有goroutine会在一个原生线程里跑

在同一个原生线程里,如果当前goroutine不发生阻塞,它是不会让出CPU时间给其他同线程的goroutines的,这是Go运行时对goroutine的调度,我们也可以使用runtime包来手工调度。

当一个goroutine发生阻塞,Go会自动地把与该goroutine处于同一系统线程的其他goroutines转移到另一个系统线程上去,以使这些goroutines不阻塞

 

http://www.cnblogs.com/hupengcool/p/3993823.html
c# U盘禁用---守护进程(插入,拔出,卸载等操作) 一、简介 传统的对U盘禁用,我们多采用修改注册表的方式,详情参考:https://blog.youkuaiyun.com/qq_25372599/article/details/79815407;本文将介绍一种其他的方式–后台守护程序。其原理非常简单:当守护程序检测到U盘的插入信号,我们自动卸载U盘,致使系统无法识别U盘,达到禁用U盘的效果。 二、程序设计 2.1 变量定义 strin... 阅读详情

相关推荐

ABAP OO - ALV_TREE例程

项目上比较少有用到ALV_TREE的报表功能,刚好项目上有写了一次,也查阅大量的范例,整合了一写法,给自己做一下笔记。 程序包含功能按钮,按钮下拉,F4帮助,读取选中行,字段双击触发事件,字段前置图标,更新节点,获取节点数据,获取全部子节点,递归算法,DMS模块:创建文档功能,创建文档链接,SNRO创建流水号,缓存数据,下次用户加载进来继续操作。 *&---------------------------------------------------------------------* *&a

大步甩起来 4991

Go语言并发详解

文章目录一、Go语言并发简述(并发的优势)进程/线程并发/并行协程/线程Goroutine 介绍channel二、Go语言goroutine(轻量级线程)使用普通函数创建 goroutine1) 格式2) 例子使用匿名函数创建goroutine1) 使用匿名函数创建goroutine的格式2) 使用匿名函数创建goroutine的例子提示三、Go语言并发通信四、Go语言竞争状态简述Goroutine 7 (finished) created at: main.main() D:/code/src/m

qq_41854911的博客 1万+

一步一步教你写股票走势图——K线图一(概述)

股票分时图部分已经开发完毕,受到了广大开发者的好评!界面、功能都挺完美,解决了好一些MP开发者的问题,博主甚是欣悦,更有动力去开源K线图。这里说一下,如果有问题直接留言或者发邮件,github上个人信息有邮件,我看到基本都会回复,博主不加qq的,体谅O(∩_∩)O。分析好了,废话不多说,我们分析下K线图吧,首先我们看下自选股K线图的效果吧效果还是很赞的,经过分时图的研究后,博主越来越确信自选股用的应

体验Android编程之美 3万+

Go流程控制——循环语句

Go 语⾔循环语句 概述 在不少实际问题中有许多具有规律性的重复操作,因此在程序中就需要重复 执⾏某些语句。循环语句包括循环处理语句及循环控制语句。 2、循环处理语句有:

DTCloud 1811

PubMedBERT:生物医学NLP中的垂直领域预训练实践与性能突破

本文深入探讨了PubMedBERT在生物医学NLP领域的应用与性能突破。作为专为生物医学文本设计的预训练模型,PubMedBERT通过全词掩码策略和BLURB基准测试,显著提升了命名实体识别、关系抽取等任务的准确率。文章还提供了PubMedBERT的实战应用案例和代码示例,展示了其在医学文献检索和电子病历结构化中的卓越表现。

kite3的博客 286

71、聚二甲基硅氧烷(PDMS)材料模型验证研究

本研究通过实验与数值模拟相结合的方法,系统探究了聚二甲基硅氧烷(PDMS)的力学性能与粘附行为。重点验证了多种超弹性材料模型在不同剥离速率下的适用性,结果表明Ogden N2模型在预测界面韧性和平均剥离力方面误差最小,表现最优。研究涵盖了PDMS的合成、单轴拉伸试验、剥离测试及有限元分析,为PDMS在机械与摩擦学领域的应用提供了可靠的建模依据,并建议在后续模拟中优先采用Ogden模型。

wine的专栏 1054

go语言LOOP

LOOP 是 Go 语言中的一个标签(label),用于标记循环语句。在这段代码中,使用标签的目的是为了同时跳出内部的 select 语句和外部的 for 循环。当执行 break LOOP 语句时,会跳出 select 语句和被标记为 LOOP 的 for 循环。这使得 goroutine 可以退出循环,并继续执行循环外的 wg.Done() 调用。如果没有使用 LOOP 标签,break 语句只会跳出 select 语句,而 goroutine 将继续执行下一次 for 循环的迭代。

qq_45662818的博客 1708

毕设-YOLOv8-OBB 实现自有数据集缺陷旋转检测全过程记录

这次项目让我深入理解了 YOLOv8-OBB 的原理和使用流程。步骤内容工具数据标注制作倾斜缺陷样本格式转换从 HBB 转换为 OBB模型训练使用 Ultralytics YOLOv8 OBBCLI 命令模型测试推理与结果可视化通过 OBB 模型,我的缺陷检测系统获得了更高的精度和鲁棒性。未来我打算继续优化数据增强方式,比如引入随机旋转、仿射变换等,让模型更适应不同角度的样本。

FJN110的博客 447

初步了解go语言中的并行

一、概念 在了解,go的并行之前,我们首先需要搞清楚一下概念。 概念描述进程可以理解为一个程序,其对应一个独立程序空间线程一个执行空间,一个进程可以有多个线程用户态的线程可以理解为就是把线程切换需要的上下文保存在线程本身。在go里面,可以将goroutine理解为用户态的线程,即协程。逻辑处理器每个逻辑处理器都会绑定一个线程,并负责goroutine的执行全局运行队列所有创建的goroutin...

hsd2012的专栏 4807

phpMyAdmin | mysqli::real_connect(): (HY000/2002): No such file or directory

第一次安装宝塔mysql服务是默认关闭的,需要手动打开,打开服务再次进入phpMyAdmin发现可以进入了。

吻等离子的博客 2872

飞牛NAS1.1.19更新后SSH连不上?两步快速恢复连接

飞牛NAS1.1.19版本更新后SSH无法连接😟,实则是官方安全策略升级默认关闭了该服务,本文分享两步实操配置恢复SSH连接💻,还同步了官方的设备安全配置建议,帮助用户兼顾使用与设备防护🔒。

XiaoqiangClub的博客 2105

Go并发编程

并发介绍 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。 B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。 C.一个进程可以创建和撤销多个线程;同一个进程中的多个线程之间可以并发执行。 协程和线程 协程:独立的栈空间,共享堆空间,调度由用户自己控制,本质上有点类似于用户级线程,这些用户级线程的调度也是自己实现的。线程:一个线程上可以跑多个协程,协程是轻量级的线程...

上山的人 2111

玩转Docker小游戏项目系列:Docker部署魔塔网页经典小游戏

玩转Docker小游戏项目系列:Docker部署魔塔网页经典小游戏

jks212454的博客 1063

【Golang】Go的并发和并行性解释。谁说Go不是并行语言?

偶然发现百度上有很多"师出同门"的"go是并发语言,而不是并行语言"的说法。最终我认为起点大概率是在"Rob Pike"(Go作者之一)于2012年发表的一场演讲,名为"并发不是并行"。之后则被标题党曲解为"go是并发语言,而不是并行语言"。简单说,Rob Pike 用很多"地鼠工人"(gopher)把一个"烧书"任务进行了循序渐进的并发设计,这是一个三只地鼠协同工作的设计,每个地鼠都是一个独立执行的一段程序。

无数_Mirage的博客 708

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

理解Go语言中的并发和并行

介绍Go语言中的并发和并行

禅与代码的艺术 953

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

25《Go语言入门》并发和并行

这是我纯手写的《Go语言入门》,手把手教你入门Go。源码+文章,看了你就会????,此处应有掌声????????????! 文章中所有的代码我都放到了github.com/GanZhiXiong/go_learning这个仓库中。在看文章的时候,对照仓库中代码学习效果更佳! 目录并发和并行的区别Go中的并发和并行 并发和并行的区别 并发(concurrency):把任务在不同时间点交给处理器进行处理。 在同一时间点,任务并不会同时运行。 并行(parallelism):把每一个任务分配给每一个处理器独立

干志雄的博客 343

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

golang语言并发与并行——goroutine和channel的详细理解

转载自: http://blog.youkuaiyun.com/skh2015java/article/details/60330785 http://blog.youkuaiyun.com/skh2015java/article/details/60330875 http://blog.youkuaiyun.com/skh2015java/article/details/60330975 如果不是我

liukuan73的专栏 5119

go语言之进阶篇并行和并发的区别与go语言并发优势

1、并行和并发的概念 并行(parallel):指在同一时刻,有多条指令在多个处理器上同时执行。 并发(concurrency):指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。 2、并行和并发的区别 并发是两个队列交替使用一台咖啡机 并行是两个...

weixin_30950607的博客 108

cpu并行和gpu并行_Go 语言并发编程系列(九)— 利用多核 CPU 实现并行计算

开始之前,我们先澄清两个概念,「多核」指的是有效利用 CPU 的多核提高程序执行效率,「并行」和「并发」一字之差,但其实是两个完全不同的概念,「并发」一般是由 CPU 内核通过时间片或者中断来控制的,遇到 IO 阻塞或者时间片用完时会交出线程的使用权,从而实现在一个内核上处理多个任务,而「并行」则是多个处理器或者多核处理器同时执行多个任务,同一时间有多个任务在调度,因此,一个内核是无法实...

weixin_39875028的博客 1032

golang语言并发与并行——goroutine和channel的详细理解(二)

Go语言的并发和并行 不知道你有没有注意到一个现象,还是这段代码,如果我跑在两个goroutines里面的话: var quit chan int = make(chan int) func loop() { for i := 0; i &lt; 10; i++ { fmt.Printf("%d ", i) } quit &lt;- 0 } f...

苦修 394

《零基础Go语言算法实战》【题目 2-21】并发和并行

Go 语言中并发的关键工具是 goroutine 和通道。goroutine 是并发的轻量级线程,而通道。换句话说,并发是程序的一种属性,它允许开发者同时进行多个任务,但不一定同。并行是同时执行两个或多个任务的运行时属性。因此,并行可以成为实现并发属性。并发是指程序可以一次处理多个任务,而并行是指程序可以使用多个处理器一次执行多。解释并发和并行的区别,并描述在 Go 语言中如何实现并发。允许 goroutine 在执行期间相互通信。的一种手段,但它只是可用的众多手段之一。【题目 2-21】并发和并行。

shirdon-廖显东的博客 153

golang高级进阶(一):进程、线程、并发、并行、goroutine协程

目录 一、关于进程和线程 1. 进程(Process) 2. 线程 二、关于并发和并行 1. 并发 2. 并行 3. 通俗讲 三、goroutine协程以及主线程 1. 主线程 2. 协程 3. 多协程和多线程 四、go关键词实操 1. 顺序执行 2. 加入go 3. 加入时间 4. 主线程执行快的情况 5. sync.WaitGroup解决不等待 6. 多协程并发并行执行 五、设置golang运行时占用的cpu核数量(不是很重要) 重点:这一篇全是干货,一定要多

genziisme的专栏 6908

go并发和并行

(Process)就是程序在操作系统中的一次执行过程,是系统进行资源分配和调度的基本单位,进程是一个动态概念,是程序在执行过程中分配和管理资源的基本单位,每一个进程都有一个自己的地址空间。管道是可以被垃圾回收机制回收的,它和关闭文件是不一样的,在结束操作之后关闭文件是必须要做的,但关闭管道不是必须的。是进程的一个执行实例,是程序执行的最小单元,它是比进程更小的能独立运行的基本单位一个进程可以创建多个线程,同一个进程中的多个线程可以并发执行,一个程序要运行的话至少有一个进程。

SunnyRivers 1520
上一篇: Netty4 自定义Decoder,Encoder进行对象传递(粘包处理)
下一篇: Java command line options for JVM performance tuning
琅琊山二当家
博客等级 码龄18年 447粉丝 322原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值