Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk melakukan konkurensi dalam golang

Bagaimana untuk melakukan konkurensi dalam golang

WBOY
WBOYasal
2023-05-16 17:56:08962semak imbas

Golang ialah bahasa yang cekap, pantas dan sangat selamat, dan ciri keselarasannya menjadikannya alat yang semakin popular dan berkuasa. Artikel ini bermula dengan konsep asas dan memperkenalkan cara Golang melaksanakan konkurensi.

1. Concurrency dan Parallelism

Perkara pertama yang perlu dijelaskan ialah perbezaan antara concurrency dan parallelism. Concurrency merujuk kepada berbilang tugas yang bertindih dan berjalan dalam tempoh masa yang sama, manakala paralelisme merujuk kepada berbilang tugas yang dijalankan pada masa yang sama. Dalam amalan, kita sering mengelirukan kedua-duanya, tetapi secara teori, mereka adalah konsep yang sama sekali berbeza.

2. Golang’s goroutine

Golang’s concurrency terutamanya bergantung pada goroutine. Goroutine ialah benang ringan di Golang, dimulakan dengan kata kunci pergi. Perbezaan terbesar antara goroutine dan benang ialah ia tidak bergantung pada rangkaian sistem pengendalian untuk pelaksanaan, tetapi diuruskan secara langsung oleh sistem masa jalan Golang. Setiap goroutine ialah unit bebas yang dijadualkan oleh persekitaran masa jalan bahasa Go (masa jalan ia akan dijalankan dalam pemproses logik Pemproses logik menentukan peruntukan goroutine kepada bilangan utas sebenar dalam sistem pengendalian.

Dalam program Golang, fungsi utama berjalan dalam goroutine secara lalai, dan goroutine lain boleh dimulakan pada bila-bila masa dan boleh dilaksanakan serentak dengan fungsi utama atau goroutine lain.

3. Gunakan kata kunci pergi untuk memulakan goroutine

Gunakan kata kunci pergi untuk memulakan goroutine dengan mudah. Kami hanya perlu menambah kata kunci pergi sebelum panggilan fungsi, dan sistem akan secara automatik membuka goroutine baharu mengikut keperluan. Contohnya:

go func1(arg1, arg2)

Pernyataan ini akan menjalankan fungsi func1 dalam bentuk goroutine, dan kod penyegerakan akan terus dilaksanakan. Pada masa ini, atur cara akan mencetak kenyataan ini dahulu dan kemudian melaksanakan kod berikut dengan serta-merta. Pada masa tertentu, masa jalan bahasa Go akan memulakan goroutine baharu untuk menjalankan fungsi tersebut. Dalam kes ini, kita tidak boleh tahu secara langsung bila goroutine dimulakan dan bila ia tamat.

Untuk fungsi dengan nilai pulangan, kita perlu menunggu goroutine selesai melaksanakan sebelum meneruskan ke langkah seterusnya Proses ini boleh dicapai dengan menggunakan saluran.

4. Saluran

Saluran ialah mekanisme komunikasi yang sangat penting dalam pengaturcaraan serentak Golang. Saluran membolehkan pertukaran data antara goroutine. Saluran sentiasa mempunyai operasi hantar dan terima, yang secara lalai menyekat sehingga hujung satu lagi sedia.

Sintaks untuk mencipta saluran adalah seperti berikut:

channel := make(chan type)

di mana jenis boleh menjadi sebarang jenis, dan saluran ialah paip dengan jenis jenis.

Sintaks untuk menghantar data ke saluran adalah seperti berikut:

channel <- data

Pernyataan ini akan menghantar data ke saluran dan menghantarnya ke goroutine menunggu untuk menerima data.

Sintaks untuk menerima data daripada saluran dalam goroutine adalah seperti berikut:

data := <- channel

Pernyataan ini akan menerima data daripada saluran. Jika tiada data dalam saluran, kenyataan ini akan menyekat menunggu data tiba.

Melalui saluran, kami boleh mengawal penyegerakan dan keselarasan antara goroutine. Contohnya:

ch := make(chan int)
go func(){
    ch <- 1
}()
data := <- ch

Pernyataan ini akan menunggu goroutine menghantar data ke saluran selepas memulakan goroutine baharu, dan kemudian menerima data daripada saluran untuk meneruskan pelaksanaan.

5. Pakej penyegerakan

Selain saluran, Golang juga menyediakan pakej Penyegerakan untuk menyokong pengaturcaraan serentak. Pakej ini menyediakan banyak fungsi dan mekanisme operasi atom seperti kunci mutex.

Fungsi operasi atom ialah konsep yang sangat penting dalam pengaturcaraan serentak Golang Ia boleh memastikan bahawa satu siri operasi tidak boleh dibahagikan semasa pelaksanaan Maksudnya, goroutine lain tidak dapat melihat keadaan perantaraan semasa menjalankan operasi atom. objek itu sama ada tidak diubah suai atau diubah suai. Ini boleh menyelesaikan masalah penyegerakan dengan baik.

Contohnya:

var sum int64 = 0
for i := 0; i < 10000; i++ {
    go func(){
        atomic.AddInt64(&sum, 1)
    }()
}

Pernyataan ini menunjukkan penggunaan fungsi operasi atom untuk melakukan pengiraan. Dalam program ini, goroutine akan terus menambah 1 kepada pembolehubah jumlah tanpa mewujudkan keadaan perlumbaan. Masalah ini disebabkan oleh kekurangan penyegerakan pembolehubah membaca dan menulis dipanggil keadaan perlumbaan, dan fungsi operasi atom dapat mengelakkan masalah ini dengan sempurna.

6. Ringkasan

Artikel ini memperkenalkan cara Golang melaksanakan konkurensi. Ia terutamanya bercakap tentang elemen asas seperti goroutine, saluran dan operasi atom Golang dalam pakej Penyegerakan, serta aplikasinya dalam pengaturcaraan serentak. Ciri konkurensi Golang bukan sahaja membantu dalam banyak bidang seperti pemprosesan tugas kejuruteraan, pemprosesan serentak pelayan dan pembangunan sistem masa nyata, tetapi juga merupakan salah satu sebab penting mengapa Golang telah menjadi bahasa pengaturcaraan yang popular.

Atas ialah kandungan terperinci Bagaimana untuk melakukan konkurensi dalam golang. 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
Artikel sebelumnya:Adakah golang mudah dipelajari?Artikel seterusnya:Adakah golang mudah dipelajari?