《7天学会Go并发编程》の第二天 写一个简单的Go并发程序以及Goroutine的使用

 

  系列文章目录

《7天学会Go并发编程》第一天 go并发实战初窥门径_大锤爱编程的博客-CSDN博客?编程就是手艺活,看了就要练,看了就要写。不写不练浪费时间撒。????今天先搞起一个Go当中的并发编程处理。一、Go当中常用并发二、Go 并发案例基本使用三、个人总结https://blog.csdn.net/alike_u/article/details/124056852?spm=1001.2014.3001.5502

《7天学会Go并发编程》の第二天 写一个简单的Go并发程序以及Goroutine的使用_大锤爱编程的博客-CSDN博客一文学会go线程的常见应用https://blog.csdn.net/alike_u/article/details/124237576?spm=1001.2014.3001.5502

《7天学会Go并发编程》第三天 go的Mutex使用_大锤爱编程的博客-CSDN博客?go语言并发编程中,简单经典好用的就是Mutex,也就是go语言中的互斥,适用于比较初阶的go并发编程。???文章里面会介绍Mutex的两个经典使用方法。目录一、go语言并发简介二、go语言并发小试牛刀2.1 原生态并发计数2.1 遇事不决,加把锁2.2 加锁慢又麻,原子操作好快省2.3channel,go并发灵魂三、总结一、Mutex是什么Mutex是go语言当中的互斥锁,作用是用来给临界区的数据加锁,保证一次只有一个goroutline可以对..https://blog.csdn.net/alike_u/article/details/124463044?spm=1001.2014.3001.5502

《7天学会Go并发编程》第四天 sync.Once和sync.WaitGroup学习应用实践_大锤爱编程的博客-CSDN博客?并发编程当总是会遇到一些线程调度的问题。有A,B,C,D四个线程,需要确保在A,B,C执行结束后,再执行D线程。比如写一段Fan-In,多表融合的代码,A,B,C从独立的三表中抽取出数据,在线程D中进行融合。那么在这个过程中,如果ABC线程数据抽取未完成,D就开始进行数据融合,势必造成数据融合结果的缺失,不完整。 单线程的单次执行,也就是说这个线程只能执行一次。比如循环判断一个条件是否满足,满足以后执行单次执行,避免重复执行。例如金额的累加,判断累加值以后,不论成功与否...https://blog.csdn.net/alike_u/article/details/124569174?spm=1001.2014.3001.5502

《7天学会Go并发编程》第五天 go语言Context的应用和实现 go实现超时判断_大锤爱编程的博客-CSDN博客系列文章目录提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:第一章 Python 机器学习入门之pandas的使用提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录系列文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的https://blog.csdn.net/alike_u/article/details/124721223?spm=1001.2014.3001.5502

《7天学会Go并发编程》第六天 go语言Sync.cond的应用和实现 go实现多线程联合执行_大锤爱编程的博客-CSDN博客CSDN话题挑战赛第1期活动详情地址:CSDN参赛话题:大数据学习记录话题描述:大数据生态圈内的理念和技术实现,包括但不局限于大数据存储(数据湖、数据仓库、消息队列等)、大数据计算(离线批、实时流等)、大数据应用(报表可视化、OLAP应用、用户画像、智能搜索、智能推荐等)、大数据的调度(各类调度器)等方面;囊括开源社区(如Apache、CDH、HDP、等)大数据技术栈以及公有云(如AWS、阿里云、华为云、腾讯云、Microsoft Azure)大数据技术栈,这里是大数据的阵地,让各类大数据理念在此百家https://blog.csdn.net/alike_u/article/details/124677244?spm=1001.2014.3001.5502

《7天学会Go并发编程》第7天 go语言并发编程Atomic原子实战操作含ABA问题_大锤爱编程的博客-CSDN博客目录一、Atomic-原子操作简介二、?go语言Atomic源码分析和实战操作2.1??? Atomic 关键函数及其释义2.1 ???atomic实战2.2 ???atomic原子并发操作2.3 ???任意数据结构的原子操作三、???总结原子操作其实和原子没有什么关系,主要借用的是原子不可分割的概念来强调说明这个操作也不可以被分割。?使用并发编程时需要解决的就是临界区(公共资源的修改)问题,抽象的数据操作行为是RAW,WAR,WAW。???体现在具体编码过程中,就是...https://blog.csdn.net/alike_u/article/details/125349003?spm=1001.2014.3001.5502

作者简介:二线厂在职大数据开发工程师。??想和从事大数据开发的同学们多多交流~

????明目张胆的摆烂,暗无声息的学习。

??有用或者有帮助的话,就一箭三抖。

目录

一、如何写一个简单的go并发程序

二、?go语言多线程简单练手任务

2.1??? 控制台输入并发打印

2.2 ???goroutine之间的通信

三、???总结

一、如何写一个简单的go并发程序

 ??一定要动手写起来,才能学会哟

     

  go并发程序的编写相对于Java来说,应用十分简单。仅需要在需要并发执行的函数或者方法前加 go关键字就可以,不像Java还需要继承才可以实现并发编程。

?在go语言中,线程的的名称是goroutine并不是thread,是因为goroutine 占用内存比较小,属于轻型资源占用,不像thread占用资源比较多,所以起了一个比较独特的名字。


????是go并发编程实现:在控制台输入数字之前,启动一个从0开始计数的goroutine。

package main

import "fmt"

func f(n int) {
  for i := 0; i < 10; i++ {
    fmt.Println(n, ":", i)
  }
}

func main() {
  go f(0)
  var input string
  fmt.Scanln(&input)
}

??执行效果:

  


????go 并发编程实现控制台打印文字

下面的代码启动两个goroutline,分别在控制台打印。

package main

import "fmt"

func main() {
	go func() {
		fmt.Println("Goroutine one 开始启动了")
	}()
	go func() {
		fmt.Println("Goroutine two 开始启动了")
	}()
	for true {

	}
}

输出:

goroutline one 开始启动了
goroutline two 开始启动了

 ??:这段代码自己跑的话,可以多输入几次。观察一下新开启的线程。

二、?go语言多线程简单练手任务

上面的章节主要介绍了如何开启一个并发线程,以及如何使用并发线程打印文字。这一节?主要实现在控制台数据输入数字,每输入一个数字开启一个新的线程打印。

2.1??? 控制台输入并发打印

  实现控制台并发数字打印

package main

import (
	"fmt"
	"strconv"
)

func main() {
	threadIndex:=0
	for true {
		var nameInput string
		fmt.Scan(&nameInput)
		go func(name string) {
			fmt.Println("goroutline +"+ strconv.Itoa(threadIndex)+" 开始启动了"+name)
		}(nameInput)
		threadIndex++
 	}
}

zhangsan
goroutline +1 开始启动了zhangsan
wangsacda
goroutline +2 开始启动了wangsacda

 效果分析:

 通过在控制台阻塞输入,实现每输入一个字符串就能单独开启一个新线程。 

语法分析

go func(name string){}("name") 启动一个参数为string类型的函数,最后面的括号实现函数String类型参数的输入。

2.2 ???goroutine之间的通信

go语言中,有一个名言名句就是通过通信来实现线程之间的数据共享。

?实现线程和主线程之间的通信

通过channel实现线程主动告知main goroutline自己的运行状态。与之前程序对比表明,不需要在main goroutline无限循环等待其他线程运行。

 package main

import "fmt"

func main() {
	ints := make(chan int, 1)
	go func(chan int) {
		fmt.Println("goroutline启动了")
		ints<-1
	}(ints)
	select {
	case <-ints:
		fmt.Print("goroutline exits")
	}
}

 执行结果: 

goroutline启动了
goroutline exits
Process finished with the exit code 0

三、???总结

       今天实现了go语言多线程编码的入门联系,简单地开启了多个go线程执行任务??⛽️~

???感谢诸位大佬的阅读,点个关注,收藏一下呗~

    


版权声明:本文为alike_u原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。