热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

「Golang成长之路」并发之Goroutine

Goroutine一、并发并发编程表现为程序有若干个自主的活动单元组成,在今天的互联网中,一个web服务器可能一次处理上千个请求,而平板电脑和手机在渲染用户界面的同时,后端还同步进











Goroutine

一、并发

并发编程表现为程序有若干个自主的活动单元组成,在今天的互联网中,一个web服务器可能一次处理上千个请求,而平板电脑和手机在渲染用户界面的同时,后端还同步进行着计算和处理网络请求等。
在go语言中每一个并发执行的活动称之为goroutine,而在我们最常见的main函数中其实也是一个goroutine(主goroutine),在此之前,我们所见的介绍语法或者程序都是顺序执行的,但是在并发编程的领域里,如果从顺序编程获取的直觉可能让我们加倍迷茫。
在此我们需要理解什么是并发:
百科:当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间 段分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状。.这种方式我们称之为并发(Concurrent)。

「Golang成长之路」并发之Goroutine
(这个是普通函数的运行模式,main将其控制权交给调用的函数,最后在返回给main)

我的理解:举个例子,我一边在上网课,一边在做笔记,我在做笔记的时候需要将网课暂停,等我的笔记做完后又继续看网课,这两件事就可以看作是一个并发的过程。

「Golang成长之路」并发之Goroutine

(协程则是:main和创建的goroutine是相互作用的,相互给予控制权,就像两个人,各做各的事,并且他们也相互通信)


二、go关键字

当一个程序启动时,只有一个goroutine来调用main,称他为主goroutine,新的goroutine通过go关键字来进行创建,看下面例子:

func main() {
for i := 0; i < 3; i++ {
//使用go关键字创建goroutine
//匿名函数
go func() {
for j := 3; j >= 0; j-- {
fmt.Println("gorouting", j)
}
}()
fmt.Println("gorouting mian:", i)
//控制程序运行时间
time.Sleep(time.Microsecond)
}
}

当然,也可以将匿名函数拿出来:

package main
import (
"fmt"
"time")
func doWorker() {
for j := 3; j >= 0; j-- {
fmt.Println("gorouting", j)
}
}
func main() {
for i := 0; i < 3; i++ {
//使用go关键字创建goroutine
go doWroker()
fmt.Println("gorouting mian:", i)
//控制程序运行时间
time.Sleep(time.Microsecond)
}
}

先来看看打印结果:

gorouting mian: 0
gorouting 3
gorouting 2
gorouting 1
gorouting 0
gorouting mian: 1
gorouting 3
gorouting 2
gorouting 1
gorouting 0
gorouting mian: 2
gorouting 3
gorouting 2
gorouting 1
gorouting 0

第二遍运行:

gorouting mian: 0
gorouting mian: 1
gorouting 3
gorouting 2
gorouting 1
gorouting 0
gorouting 3
gorouting 2
gorouting 1
gorouting 0
gorouting mian: 2
gorouting 3
gorouting 2
gorouting 1
gorouting 0

程序解释:其实可以看出,每一遍的运行结果都是不一样的,当程序加入第一个for , i=0时,运行到关键字go时,新的goroutine就创建了,但是程序不会立即执行新的goroutine,它会进行执行main中其余的代码,在我们的这个例子中,第一遍运行,时就是这个结果,第二遍运行时也是同样的。

func main(){
var a[10] int
for i := 0; i < 10;i++{
//使用go关键字创建goroutine
//匿名函数
go func(i int){
for{
a[i]++
}
}(i)
}
time.Sleep(time.Microsecond)
fmt.Println(a)
}

打印结果:

[39904 0 0 9122 0 7123 0 0 0 0]

程序解释:在for循环中一共创建了10个goroutine,有的goroutine执行了,有的还处于等待状态,但是我们给主goroutine的时间不多,所以有一些还来不及执行就被主goroutine杀掉了,这样我们就能理解打印结果了。


三、goroutine切换点(可能)

goroutine可能切换:



  1. I/O、select
  2. channel
  3. 等待锁
  4. 函数调用(有时)
  5. runtime.Gosched



golang


推荐阅读
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • Java 11相对于Java 8,OptaPlanner性能提升有多大?
    本文通过基准测试比较了Java 11和Java 8对OptaPlanner的性能提升。测试结果表明,在相同的硬件环境下,Java 11相对于Java 8在垃圾回收方面表现更好,从而提升了OptaPlanner的性能。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文介绍了基于c语言的mcs51单片机定时器计数器的应用教程,包括定时器的设置和计数方法,以及中断函数的使用。同时介绍了定时器应用的举例,包括定时器中断函数的编写和频率值的计算方法。主函数中设置了T0模式和T1计数的初值,并开启了T0和T1的中断,最后启动了CPU中断。 ... [详细]
  • 基于事件驱动的并发编程及其消息通信机制的同步与异步、阻塞与非阻塞、IO模型的分类
    本文介绍了基于事件驱动的并发编程中的消息通信机制,包括同步和异步的概念及其区别,阻塞和非阻塞的状态,以及IO模型的分类。同步阻塞IO、同步非阻塞IO、异步阻塞IO和异步非阻塞IO等不同的IO模型被详细解释。这些概念和模型对于理解并发编程中的消息通信和IO操作具有重要意义。 ... [详细]
  • 关于CMS收集器的知识介绍和优缺点分析
    本文介绍了CMS收集器的概念、运行过程和优缺点,并解释了垃圾回收器的作用和实践。CMS收集器是一种基于标记-清除算法的垃圾回收器,适用于互联网站和B/S系统等对响应速度和停顿时间有较高要求的应用。同时,还提供了其他垃圾回收器的参考资料。 ... [详细]
  • 本文介绍了Java的公式汇总及相关知识,包括定义变量的语法格式、类型转换公式、三元表达式、定义新的实例的格式、引用类型的方法以及数组静态初始化等内容。希望对读者有一定的参考价值。 ... [详细]
author-avatar
w手机用户2736240235dOD
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有