Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Peraturan keemasan pengaturcaraan serentak di Golang: penggunaan Goroutines yang bijak untuk mencapai prestasi optimum

Peraturan keemasan pengaturcaraan serentak di Golang: penggunaan Goroutines yang bijak untuk mencapai prestasi optimum

王林
王林asal
2023-07-17 10:24:09757semak imbas

Peraturan emas pengaturcaraan serentak di Golang: Gunakan Goroutines dengan mahir untuk mencapai prestasi optimum

Pengenalan:
Golang (atau bahasa Go) ialah bahasa yang sangat berkuasa dari segi pengaturcaraan serentak. Model konkurensinya dilaksanakan menggunakan Goroutines dan Saluran, menjadikannya lebih mudah bagi pembangun untuk menulis program serentak yang cekap dan berskala. Dalam artikel ini, kami akan meneroka beberapa peraturan emas pengaturcaraan serentak di Golang dan memperkenalkan cara menggunakan Goroutines dengan bijak untuk mencapai prestasi optimum. Kami akan menggunakan contoh kod untuk menggambarkan cara garis panduan ini digunakan pada senario dunia sebenar.

1. Elakkan kebocoran benang

Apabila menggunakan Goroutines, kesilapan biasa ialah mencipta sejumlah besar Goroutines tanpa menutup atau mengurusnya dengan betul. Ini boleh membawa kepada masalah seperti kebocoran memori dan penggunaan sumber sistem yang berlebihan. Untuk mengelakkan perkara ini berlaku, kita boleh menggunakan jenis penyegerakan.WaitGroup untuk mengurus kitaran hayat Goroutines. Berikut ialah contoh:

package main

import (
    "fmt"
    "sync"
)

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func(index int) {
            defer wg.Done()
            fmt.Printf("Goroutine %d
", index)
        }(i)
    }
    wg.Wait()
    fmt.Println("All Goroutines finished")
}

Dalam contoh di atas, kami menggunakan jenis penyegerakan.WaitGroup untuk menjejaki semua Goroutine. Setiap kali Goroutine melaksanakan, kami memanggil kaedah Add() untuk menambah pembilang. Apabila Goroutine selesai melaksanakan, kami menggunakan kaedah Done() untuk mengurangkan pembilang. Akhir sekali, kami menggunakan kaedah Wait() untuk menyekat Goroutine utama semasa sehingga semua Goroutine telah dilaksanakan.

2. Hadkan bilangan mata wang

Dalam sesetengah senario, kita mungkin perlu mengehadkan bilangan Goroutine yang dilaksanakan pada masa yang sama untuk mengelakkan penggunaan sumber yang berlebihan dan kemerosotan prestasi. Golang menyediakan mod semaphore untuk mengehadkan bilangan mata wang. Berikut ialah contoh:

package main

import (
    "fmt"
    "sync"
)

var sem = make(chan struct{}, 5)

func task(index int) {
    sem <- struct{}{}
    defer func() {
        <-sem
    }()

    fmt.Printf("Goroutine %d
", index)
}

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func(index int) {
            defer wg.Done()
            task(index)
        }(i)
    }
    wg.Wait()
    fmt.Println("All Goroutines finished")
}

Dalam contoh di atas, kami mencipta semaphore (sem) dengan saiz penimbal 5. Dalam setiap Goroutine, kami menggunakan operator "<-" untuk menghantar struktur kosong ke saluran semaphore untuk memohon kebenaran serentak. Selepas Goroutine dilaksanakan, kami menggunakan operator "<-" untuk menerima struktur kosong daripada saluran semaphore dan mengeluarkan kebenaran serentak.

3. Gunakan kunci yang lebih canggih

Apabila berbilang Goroutines mengakses dan mengubah suai data yang dikongsi, untuk memastikan ketekalan dan keselamatan data, kita perlu menggunakan kunci. Di Golang, pakej penyegerakan menyediakan satu siri jenis kunci, termasuk Mutex, RWMutex dan Cond. Kita perlu memilih jenis kunci yang sesuai mengikut senario tertentu.

4. Elakkan keadaan perlumbaan

Syarat perlumbaan merujuk kepada berbilang Goroutine yang mengakses dan mengubah suai data yang dikongsi pada masa yang sama, mengakibatkan keputusan yang tidak pasti atau tidak konsisten. Untuk mengelakkan keadaan perlumbaan, kami boleh menggunakan operasi atom yang disediakan oleh Golang atau melindungi data kongsi melalui penguncian. Berikut ialah contoh penggunaan operasi atom:

package main

import (
    "fmt"
    "sync/atomic"
)

var counter int64

func increase() {
    atomic.AddInt64(&counter, 1)
}

func main() {
    for i := 0; i < 10; i++ {
        go increase()
    }
    fmt.Println(atomic.LoadInt64(&counter))
}

Dalam contoh di atas, kami menggunakan fungsi operasi atom yang disediakan oleh pakej atom untuk menambah nilai pembilang. Operasi atom ini memastikan bahawa akses kepada kaunter adalah atom dan mengelakkan keadaan perlumbaan.

Kesimpulan:
Dengan menggunakan Goroutines dengan betul dan teknik pengaturcaraan serentak yang lain, kami boleh mencapai program serentak yang cekap dan berskala di Golang. Dalam artikel ini, kami memperkenalkan beberapa peraturan emas untuk pengaturcaraan serentak di Golang, termasuk mengelakkan kebocoran benang, mengehadkan bilangan mata wang, menggunakan lebih banyak kunci berbutir dan mengelakkan keadaan perlumbaan. Saya harap artikel ini dapat membantu pembaca menguasai teknologi pengaturcaraan serentak Golang dengan lebih baik dan mencapai prestasi optimum dalam projek sebenar.

Atas ialah kandungan terperinci Peraturan keemasan pengaturcaraan serentak di Golang: penggunaan Goroutines yang bijak untuk mencapai prestasi optimum. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn