>백엔드 개발 >Golang >Go 언어 동시성의 기본을 소개하는 기사

Go 언어 동시성의 기본을 소개하는 기사

Go语言进阶学习
Go语言进阶学习앞으로
2023-07-21 10:33:26900검색

소개

Go 언어, concurrency를 위해 특별히 설계된 언어입니다. microthread를 시작할 때마다 하나는 대략 2KB2KB起步

假设一个内存条大小4G,一个微线程2kb1G=1024M=1048576kb1048576/2=524288,五十多万个

但是你知道像Java,Python等语言,一个线程代价多大吗???,2MB起步,代价直接翻了千倍

所以,激动吧,随便用Go写一个web程序,基本都相当于Nginx시작하기

🎜

🎜메모리 스틱 크기 가정🎜🎜🎜4G🎜🎜🎜, 마이크로 스레드🎜🎜 🎜2kb🎜🎜🎜, 🎜🎜1G=1024M=1048576kb 🎜🎜, 🎜🎜1048576/2= 524288🎜🎜, 50만 개 이상 🎜🎜

🎜하지만 Java, Python 및 기타 언어와 같은 언어의 스레드 비용이 얼마나 되는지 아시나요???,🎜🎜2MB🎜🎜시작하면 가격이 1000배로 두 배로 올랐어요🎜🎜

🎜자, Go로 웹 프로그램을 작성해 보세요. 기본적으로 🎜와 같습니다. 🎜Nginx🎜🎜

<br><br>

goroutine

Go中的微线程,也叫做goroutinegoroutine是并行处理任务的

就像我用两只手同时操作两个手机打游戏一样

而不是一个手玩玩这个,一个手玩玩那个,这样切换式玩法

goroutine由Go的runtime完成调度,goroutinegoroutine

Go中的微线程,也叫做

고루틴

,🎜🎜고루틴🎜🎜是并行处理任务的🎜🎜

🎜就image我两只手同时操作两个手机打游戏一样🎜🎜

🎜而不是一个手玩玩这个,一个手玩玩那个,这样切换式玩法🎜🎜

🎜고루틴🎜🎜由Go的🎜🎜런타임🎜🎜完成调島,🎜🎜고루틴🎜🎜적본质是재대码(용户态)级别完成的切换,代价很小🎜🎜🎜🎜이미지 Java, Python等语言的线程, 是以代价不常大🎜🎜

고루틴goroutine是由runtime完成切换,并且runtime经过Google公司的数位大佬优化,已经很小母牛上山了,牛逼哄哄了。

<br>

使用goroutine

在Go中使用goroutine很简单,只需要在想调用的函数前加一个go就行了,这就代表启动了一个goroutine

🎜런타임🎜🎜완전한 전환 , 그리고 🎜🎜런타임🎜🎜Google 제공 디지털 마스터가 최적화한 작은 소가 산에 올라갔는데 정말 대단해요. 🎜🎜🎜🎜<br>🎜🎜

🎜고루틴 사용🎜

🎜Go에서 사용🎜🎜goroutine🎜🎜은 매우 간단합니다. 원할 때만 호출하면 됩니다 🎜 함수 앞에 go만 추가하세요🎜🎜. 즉, 🎜🎜고루틴🎜🎜

일반 호출 함수 방식

Function

func Say() {
    time.Sleep(time.Second)
    fmt.Println("我在说话说了1s说完了...")
}

main<br>

func main() {
    //开始时间
    var start_time = time.Now()
    //启动10个say说话
    for i := 0; i < 10; i++ {
        Say()
}
    //结束时间
    var end_time = time.Now()
    //计算时间差
    fmt.Println(end_time.Sub(start_time))
}

실행 결과<br>

Go 언어 동시성의 기본을 소개하는 기사

10번 반복했는데 10초가 걸렸습니다. 느린! <br>

<br>

고루틴 함수 호출 방법

함수는 여전히 위의 함수입니다

main

func main() {
    //开始时间
    var start_time = time.Now()
    //启动10个say说话
    for i := 0; i < 10; i++ {
        go Say()
}
    //结束时间
    var end_time = time.Now()
    //计算时间差
    fmt.Println(end_time.Sub(start_time))
}

참고: 6번째 줄에 go in을 추가하세요. front 키워드인 go 키워드는 이 함수를 마이크로 스레드에서 별도로 실행하는 것을 의미합니다. <br>

실행 결과

Go 언어 동시성의 기본을 소개하는 기사

무슨일이야??? <br>

<br>

왜 이런 0의 상황이 발생하는 걸까요

Go에서는 데몬 스레드 방식을 사용하기 때문입니다.

Go 언어 동시성의 기본을 소개하는 기사

Go에서는 주요 기능이 실행되는 한 다른 마이크로 스레드는 유휴 상태입니다.

일부 몬스터들처럼 서로서로, 그리고 엄마의 몸에 의존하고 있습니다. 엄마의 몸이 죽으면 아래의 아기도 죽습니다.

이 문제를 해결하는 방법은???

<br>

sync.WaitGroup

위에서 언급했듯이 일부 마이크로 스레드가 시작되었지만 마이크로 스레드가 이전에 종료된 것을 발견했습니다. main 함수 가 너무 빠르게 실행되고 main 실행이 완료되고 Go 런타임이 자동으로 다른 마이크로 스레드를 닫았기 때문입니다.

그럼 생각해보세요. 어떻게 하면 마지막에 메인잠깐만요, 아이들이 돌아오면 계속 달릴 거에요.

所以,有一个新的问题,那就是等,祭出法宝sync.WaitGroup

先看一下怎么用

函数

func Say() {
    //函数结束时取消标记
    defer wg.Done()
    //每个函数在启动时加上一个标记
    wg.Add(1)
    //函数开始打上一个标记
    time.Sleep(time.Second*1)
    fmt.Println("我在说话说了1s说完了...")
}

main<br>

var wg  sync.WaitGroup
func main() {
    //开始时间
    var start_time = time.Now()
    //启动10个say说话
    for i := 0; i < 10; i++ {
        go Say()
}
    // 等待所有标记过的微线程执行完毕
    wg.Wait()
    //结束时间
    var end_time = time.Now()
    //计算时间差
    fmt.Println(end_time.Sub(start_time))
}

执行结果<br>

Go 언어 동시성의 기본을 소개하는 기사

可以看到,10个线程同时启动,1s就完了,并且代码相对简单,就算开启10w个,还是1s多一点<br>

这也是为什么很多公司越来越青睐Go的原因。

Go 언어 동시성의 기본을 소개하는 기사

runtime.GOMAXPROCS<br>

这个意思要使用多少个核,默认使用全部核心,性能跑满,但是也有意外的情况,

比如一个机器跑了很多其他任务,Go写的这个是不太重要的任务,但是是计算型的,这时候理论来说是不尽量挤兑别人的算力

所以要限制一下当前程序使用电脑的算力

代码

func main() {
    //本机的cpu个数
    var cpuNum = runtime.NumCPU()
    fmt.Println(cpuNum)
    //设置Go使用cpu个数
    runtime.GOMAXPROCS(4)
}

<br>

总结<br>

上述我们学习了Go的并发,学习了

  • 如何创建一个协程(goroutine)。

  • 为什么需要sync.WaitGroup

  • 设置当前程序使用CPU核数。

위 내용은 Go 언어 동시성의 기본을 소개하는 기사의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 Go语言进阶学习에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제