Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Analisis mendalam ciri bahasa Golang: penyegerakan serentak dan mekanisme pengecualian bersama

Analisis mendalam ciri bahasa Golang: penyegerakan serentak dan mekanisme pengecualian bersama

WBOY
WBOYasal
2023-07-17 22:55:45881semak imbas

Analisis mendalam ciri bahasa Golang: penyegerakan serentak dan mekanisme pengecualian bersama

Pengenalan:
Dengan perkembangan pesat Internet dan teknologi komputer, populariti pemproses berbilang teras menjadikan pengaturcaraan serentak semakin penting. Dalam pengaturcaraan serentak, mekanisme penyegerakan dan pengecualian bersama adalah alat penting untuk memastikan ketepatan data yang dikongsi antara berbilang rangkaian atau coroutine. Dalam artikel ini, kita akan menyelidiki ciri-ciri pengaturcaraan serentak dalam bahasa Golang, memfokuskan pada penyegerakan dan mekanisme pengecualian bersama, dan menerangkan prinsip pelaksanaannya melalui contoh kod.

1. Model Concurrency bahasa Golang
Golang menggunakan model concurrency goroutine, iaitu benang ringan yang diuruskan oleh penjadual bahasa Go sendiri. Berbanding dengan benang tradisional, coroutine mempunyai ruang tindanan yang lebih kecil, kelajuan penciptaan yang lebih tinggi dan konkurensi yang lebih tinggi, menjadikan pengaturcaraan serentak lebih mudah dan lebih cekap di Golang.

2. Mekanisme penyegerakan serentak Golang: Saluran dan Mutex

  1. Saluran
    Saluran ialah mekanisme untuk komunikasi selamat benang dalam pengaturcaraan serentak Golang. Golang menyediakan kaedah komunikasi menyekat segerak, iaitu penghantar menghantar data ke saluran dan penerima menerima data daripada saluran. Semasa proses penghantaran dan penerimaan, jika saluran penuh atau kosong, benang akan menyekat dan menunggu sehingga syarat dipenuhi. Kaedah komunikasi ini boleh mengelakkan masalah perbalahan sumber yang biasa dalam pengaturcaraan tradisional.

Berikut ialah kod sampel yang menggunakan saluran untuk pengiraan serentak:

package main

import (
    "fmt"
    "time"
)

func CalculateSum(numbers []int, ch chan int) {
    sum := 0
    for _, number := range numbers {
        sum += number
    }
    ch <- sum
}

func main() {
    numbers := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
    ch := make(chan int)
    go CalculateSum(numbers[:len(numbers)/2], ch)
    go CalculateSum(numbers[len(numbers)/2:], ch)
    sum1, sum2 := <-ch, <-ch
    totalSum := sum1 + sum2
    fmt.Println("Total sum is", totalSum)
}

Dalam kod sampel ini, kita mula-mula mencipta saluran ch, dan kemudian menggunakan dua goroutine untuk mengira serentak jumlah nombor tatasusunan dan lulus hasilnya melalui saluran Dilepaskan kembali ke utas utama. Akhir sekali, kami menambah dua jumlah untuk mendapatkan jumlah akhir.

  1. Mutex (Mutex)
    Mutex ialah satu lagi alat pengaturcaraan serentak yang biasa digunakan di Golang, digunakan untuk melindungi akses kepada sumber kongsi. Apabila beberapa utas atau coroutine mengakses sumber yang dikongsi pada masa yang sama, kunci mutex boleh memastikan bahawa hanya satu utas atau coroutine boleh beroperasi pada sumber yang dikongsi pada masa yang sama.

Berikut ialah kod sampel yang menggunakan kunci mutex untuk melindungi pembolehubah yang dikongsi:

package main

import (
    "fmt"
    "sync"
    "time"
)

var count int
var mutex sync.Mutex

func Increment() {
    mutex.Lock()
    defer mutex.Unlock()
    count++
}

func main() {
    for i := 0; i < 100; i++ {
        go Increment()
    }

    time.Sleep(time.Second)
    fmt.Println("Count is", count)
}

Dalam kod sampel ini, kami mentakrifkan kiraan pembolehubah global dan mutex kunci mutex. Dalam fungsi Penambahan, kita mula-mula mendapatkan kawalan kunci mutex dengan memanggil kaedah mutex.Lock(), kemudian melaksanakan operasi count++, dan akhirnya memanggil kaedah mutex.Unlock() untuk melepaskan kunci mutex. Ini memastikan bahawa hanya satu goroutine boleh beroperasi pada kiraan setiap kali, dengan itu memastikan ketepatan kiraan.

Kesimpulan:
Dengan menggunakan saluran dan kunci mutex, Golang menyediakan mekanisme pengaturcaraan serentak yang ringkas dan cekap. Ciri penyekatan dan penyegerakan saluran menjadikan pengaturcaraan serentak lebih selamat dan lebih dipercayai, manakala kunci mutex boleh melindungi akses kepada sumber yang dikongsi dan mengelakkan masalah persaingan sumber. Dalam pengaturcaraan serentak sebenar, kita boleh memilih mekanisme yang sesuai mengikut senario yang berbeza untuk mencapai pengkomputeran selari yang cekap dan boleh dipercayai.

Rujukan:

  • "Spesifikasi Bahasa Pengaturcaraan Go", https://golang.org/ref/spec
  • "Concurrency in Go", https://golang.org/doc/effective_go.html#concurrency

Atas ialah kandungan terperinci Analisis mendalam ciri bahasa Golang: penyegerakan serentak dan mekanisme pengecualian bersama. 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