2022-5-25 实习Day44

1、汇出汇款,收款人清算渠道为境内外币可命中,swift不可命中问题排查 – 3小时 50%
2、代理行转汇退汇中退汇行swiftcode点击放大镜后不会展现信息,需输入条件,待改进 – 2小时 50%
3、汇出汇款会计科目中冗余配置修改及删除 – 2小时 70%

Golang编程学习(part 39)

1、goroutine基本介绍

【1】需求:需要统计1-9000000000的数字中哪些是素数

分析思路:

  • 传统的方法就是使用一个循环,循环的判断各个数是不是素数。(很慢)
  • 使用并发或者并行的方式,将统计素数的任务分配给多个goroutine去完成,这时就会使用到goroutine(速度提高4倍)

【2】进程和线程介绍
  • 进程就是程序在操作系统中的一次执行过程,是系统进行资源分配和调度的基本单位
  • 线程是进程的一个执行实例,是程序执行的最小单元,它是比进程更小的能独立运行的基本单位
  • 一个进程可以创建和销毁多个线程,同一个进程中的多个线程可以并发执行
  • 一个程序至少有一个进程,一个进程至少有一个线程

【3】程序、进程和线程的关系示意图

image-20220711163151045


【4】并发和并行
  • 多线程程序在单核上运行,就是并发(一段时间内单核执行多个程序)

  • 多线程程序在多核上运行,就是并行(同一时刻执行多个任务)

  • 示意图

    image-20220711163603288


【5】Go协程和Go主线程
Go主线程(有程序员直接称为线程/也可以理解成进程):一个Go线程上可以起多个协程,你可以这样理解,协程是轻量级的线程(编译器做优化)

Go协程的特点
  • 有独立的栈空间
  • 共享程序堆空间
  • 调度由用户控制
  • 协程是轻量级的线程

一个示意图

image-20220711164350467



2、goroutine快速入门

【1】案例说明

请编写一个程序完成如下功能:

  • 在主线程(可以理解成进程)中,开启一个goroutine,该协程每隔1秒输出“hello,world”
  • 在主线程中方也每隔一秒输出“hello,golang”,输出10次后,退出程序
  • 要求主线程和goroutine同时执行
  • 华晨主线程和协程执行流程图
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package main

import (
"fmt"
"strconv"
"time"
)

func main() {
// 开启了一个协程
go goroute()
for i := 0; i < 10; i++ {
fmt.Println("main hello,world " + strconv.Itoa(i))
time.Sleep(time.Second)
}
}

// 编写了一个函数,每隔1秒输出"hello,world"
func goroute() {
for i := 0; i < 10; i++ {
fmt.Println("gorou hello,golang " + strconv.Itoa(i))
time.Sleep(time.Second / 2)
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 输出的效果说明,main这个主线程和goroute协程同时执行
main hello,world 0
gorou hello,golang 0
gorou hello,golang 1
main hello,world 1
gorou hello,golang 2
gorou hello,golang 3
main hello,world 2
gorou hello,golang 4
gorou hello,golang 5
main hello,world 3
gorou hello,golang 6
gorou hello,golang 7
main hello,world 4
gorou hello,golang 8
gorou hello,golang 9
main hello,world 5
main hello,world 6
main hello,world 7
main hello,world 8
main hello,world 9

【2】主线程和协程执行流程图

image-20220711170454504


【3】快速入门小结
  • 主线程是一个物理线程,直接作用在cpu上的,是重量级的,非常消耗cpu资源
  • 协程是从主线程开启的,是轻量级的线程,是逻辑态,对资源消耗相对较小
  • Golang的协程机制是重要的特点,可以轻松的开启上万个协程。其他编程语言的并发机制是一般基于线程的,开启过多的线程资源消耗大,这里就凸显Golang在并发上的优势了


3、goroutine的调度模型

【1】MPG模型的基本介绍

image-20220711171139968


【2】MPG模式运行的状态1

image-20220711171236516


【3】MPG模式运行的状态2

image-20220711171432774


4、设置Golang运行的cpu个数

【1】为了充分利用多核cpu的优势,在Golang程序中设置运行的cpu数目
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// go1.8后,默认让程序运行在多个核上,可以不用设置了
// go1.8前,还是要设置一下,可以更高效的利用cpu
package main

import (
"fmt"
"runtime"
)

func main() {
// 获取当前系统cpu的数量
cpuNum := runtime.NumCPU()

// 我这里设置num-1的cpu运行go程序
runtime.GOMAXPROCS(cpuNum - 1)
fmt.Println("num=", cpuNum)
}