Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Artikel untuk memperkenalkan anda kepada asas keselarasan bahasa Go

Artikel untuk memperkenalkan anda kepada asas keselarasan bahasa Go

Go语言进阶学习
Go语言进阶学习ke hadapan
2023-07-21 10:33:26878semak imbas

Pengenalan

Go bahasa, bahasa yang direka khusus untuk concurrency, setiap kali anda memulakan kosnya tentang untuk mencipta satu 2KBBermula

2KB

起步

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

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

所以,激动吧,随便用Go写一个web程序,基本都相当于NginxAnggap saiz kayu memori

🎜4G🎜🎜🎜, a benang mikro🎜🎜 🎜2kb🎜🎜🎜, 🎜🎜 1G=1024M=1048576kb 🎜🎜, 🎜🎜1048576/2= 524288🎜🎜, lebih daripada setengah juta 🎜🎜

🎜Tetapi adakah anda tahu berapa kos benang dalam bahasa seperti Java, Python dan bahasa lain???,🎜🎜2MB🎜🎜Bermula, harga terus meningkat seribu kali ganda🎜🎜

🎜Jadi, terujalah, tulis sahaja program web dalam Go, ia pada dasarnya bersamaan dengan 🎜🎜 Nginx🎜🎜

<br><br>

goroutine

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

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

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

goroutine由Go的runtime完成调度,goroutinegoroutine

Go中的微线程,也叫做

goroutine

,🎜🎜goroutine🎜🎜是并行处理任务的🎜🎜

🎜就像我用两只手同时操作两个手机打游戏一样🎜="paragraf"1 style="line-height: inherit;anak yatim: 4;margin-top: 0.8em;margin-bottom: 0.8em;white-space: pre-wrap;font-family: "Open Sans", "Clear Sans", " Helvetica neue ", Helvetica, Arial, Sans-Serif; Saiz Font: 16px; Text-Align: Start;"> 🎜 不 是 一 个 个 手 玩 玩 这个, 一 个 玩 玩 那个 那个 玩 玩 玩 玩 🎜🎜 ="n16" mdtype="paragraph" style="line-height: inherit;anak yatim: 4;margin-top: 0.8em;margin-bottom: 0.8em;white-space: pre-wrap;font-family: "Buka Sans", "Clear Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;font-size: 16px;text-align: start;">🎜goroutine🎜🎜由Go的🎜🎜runtime🎜🎜完成调度,🎜🎜goroutine🎜🎜的本质是在代码(用户态)级别完成的廇卢🎜🎜🎜🎜像Java,Python等语言的线程,是在操作系统(内核态)级别完成的切花,所以代价非常大🎜

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

<br>

使用goroutine

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

🎜runtime🎜🎜Penukaran lengkap , Dan 🎜🎜runtime🎜🎜Oleh Google Dioptimumkan oleh bos digital, lembu kecil itu telah mendaki gunung, dan ia sangat hebat. 🎜🎜🎜🎜<br>🎜🎜

🎜Gunakan goroutine🎜

🎜Gunakan dalam Go🎜🎜goroutine🎜🎜 sangat mudah, anda hanya perlu memanggilnya apabila anda mahu 🎜 Cuma tambah pergi sebelum fungsi🎜🎜, yang bermaksud bahawa 🎜🎜goroutine🎜🎜Kaedah fungsi panggilan biasa

Ia bergelung 10 kali dan mengambil masa 10 saat, iaitu sedikit lambat!

goroutine kaedah memanggil fungsi<br>

Fungsi masih seperti di atas

reee<br>

rmain

Artikel untuk memperkenalkan anda kepada asas keselarasan bahasa Go

:

Barisan 6, tambah masuk kata kunci hadapan, kata kunci pergi bermakna menjalankan fungsi ini secara berasingan dalam benang mikro. <br>

<br>Hasil pelaksanaan

apa??? 0s, apa yang berlaku? <br>

<br>

Mengapa situasi 0s ini berlaku

Ini kerana, dalam Go, kami menggunakan kaedah benang daemon.

Artikel untuk memperkenalkan anda kepada asas keselarasan bahasa Go

Dalam Go, selagi fungsi utama dilaksanakan, benang mikro lain akan terbiar.

Sama seperti beberapa raksasa, mereka bergantung antara satu sama lain dan badan ibu Jika badan ibu mati, bayi di bawah juga akan mati. Jadi bagaimana untuk menyelesaikan masalah ini? ia boleh dilaksanakan , kerana fungsi

utama

berjalan terlalu pantas,

<br>utama selesai berjalan

, dan masa jalanan Go menutup benang mikro lain secara automatik. .

所以,有一个新的问题,那就是等,祭出法宝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>

Artikel untuk memperkenalkan anda kepada asas keselarasan bahasa Go

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

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

Artikel untuk memperkenalkan anda kepada asas keselarasan bahasa 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核数。

Atas ialah kandungan terperinci Artikel untuk memperkenalkan anda kepada asas keselarasan bahasa Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:Go语言进阶学习. Jika ada pelanggaran, sila hubungi admin@php.cn Padam