Go并发编程之一

news/2024/10/22 6:05:43/

一、前言

         新年学新语言Go系列文章已经完结,用了最简单的例子去了解Go基础语法,但Go最牛B的是它对并发的友好支持,每一门语言都有它自己独特的优势,如Java适合大型工程化项目,Python适合做数据分析及运维脚本,而Go最适合用来做高并发的网络通讯,PHP适合快速开发网站,所以有兴趣都可以学习了解一下,编程思路是互通。关于Go并发 新年学新语言Go之一 有一个概略的介绍,这一系列会从最简单一些例子入手,然后穿插介绍一些必要的理论。

二、例子1

执行结果:无任何输出

在函数或方法前面加上关键字 go,它会启动一个goroutine(协程),然后被放在队列中等待调度器来决定什么时候执行这个goroutine。然而main这个主协程已经执行完成,Go进程都Over了,新创建的goroutine还没有被调度执行,所有大概率是无任何输出。

操作系统理论讲的是一个进程至少要包含一个线程,随着进程的启动会创建第一个线程,这个称为主线程,goroutine也类似。

执行结果:Go,Goroutine!

加上time.Sleep,会让main所有的goroutine进行暂停(进入Gwaiting状态),然后println("Go,Goroutine!") 这个goroutine就有可能被调度执行了,但这也并不是很保险,可以换成调用runtime.Gosched()来暂停当前goroutine,让其它goroutine有机会运行。

三、例子2

执行结果:Hello,Qingcai18036!

执行结果说明了在name = "Qingcai18036"执行之后,上面那个go函数才得以被调度执行。下面更换一下最后两条语句顺序

执行结果:Hello,Qingcai!

这是因为在改变name变量的值之前,就给了go函数执行的机会了。

四、例子3

执行结果:

这是因为for里的迭代变量name虽然会依次被赋予qingcai1,qingcai2,qingcai3,但这里并发执行的go函数是在for语句执行完才执行,因为for遍历非常快,这时name已经指向 qingcai3了。

执行结果

将time语句放在循环内就可以在迭代完成之前给每个go函数一个执行的机会,但这也不保险

执行结果:

让go函数中使用的name不会受外部变量的影响,go函数可以有参数声明,然后将迭代变量name做为参数传递给go函数,因为name变量的类型是string它是非引用类型,我们把值做为参数传给函数时该值会被复制,对于引用类型这样处理就没有作用了,另外可以看到结果的顺序是乱的,因为调度器什么时候执行goroutine是不确定的。

注:相对于其它语言,Go启动一个协程语法实在是太简单了!简单就是好。


http://www.ppmy.cn/news/1169181.html

相关文章

迁移kubelet、docker和containerd工作目录

文章目录 问题背景迁移Docker停止 Docker 服务修改配置移动文件重新启动 Docker 服务 containerd停止服务修改配置移动文件重新启动服务 kubelet(遇到问题待解决)停止服务修改配置移动文件(遇到问题待解决)重新启动服务 使用的版本…

flutter开发的一个小小小问题,内网依赖下不来

问题 由于众所周知的原因,flutter编译时,经常出现Could not get resource https://storage.googleapis.com/download.flutter.io…的问题,如下: * What went wrong: Could not determine the dependencies of task :app:lintVit…

Java开发规范记录

不要使用 count(column)或 count(1)来替代 count(*),count(*)是 SQL92 定义的 标准统计行数的语法,跟数据库无关,跟 NULL 和非 NULL 无关。 注意:count(*)会统计值为 NULL 的行,而 count(列名)不会统计此列为 NULL 值的…

idea + Docker-Compose 实现自动化打包部署(仅限测试环境)

一、修改docker.service文件,添加监听端口 vi /usr/lib/systemd/system/docker.service ExecStart/usr/bin/dockerd -H fd:// --containerd/run/containerd/containerd.sock -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock重启docker服务 systemctl daemo…

towxml的使用,在微信小程序中快速将markdown格式渲染为wxml文本

towxml的使用,在微信小程序中快速将markdown格式渲染为wxml文本 Towxml概述安装下载 Towxml在小程序中使用 towxml Towxml概述 towxml3.0 支持以下功能: ● echarts图表,默认禁用,需自行构建以开启此功能 ● LaTeX数学公式&#…

python在nacos注册微服务

安装 首先需要安装python的nacos sdk pip install nacos-sdk-python 注册 注册过程非常简单,需要注意的是,注册完要定时发送心跳,否则服务会被nacos删掉。 import nacos import timeSERVER_ADDRESSES "http://1.2.3.4:8848" …

插入排序(学习笔记)

插入排序 每一轮插入排序后的结果与打扑克牌取牌原理相似,将取到的牌插入到合适的位置,但在程序实现方面还是基于交换的算法。 它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增1的有序表。 import java.util.…

容器技术基础

1. Linux Namespace和Cgroups 对于 Docker 等大多数 Linux 容器来说,Cgroups 技术是用来制造约束的主要手段,而 Namespace 技术则是用来修改进程视图的主要方法。 1.1 PID Namespace //Linux 系统正常创建线程 int pid clone(main_function, stack_s…