Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Menyelam mendalam tentang cara mekanisme penyekatan dilaksanakan di Golang

Menyelam mendalam tentang cara mekanisme penyekatan dilaksanakan di Golang

PHPz
PHPzasal
2023-04-03 09:18:27744semak imbas

Golang ialah bahasa pengaturcaraan berkuasa yang secara beransur-ansur menjadi semakin popular apabila menulis aplikasi berkonkurensi tinggi dan ketersediaan tinggi. Di Golang, kami boleh melaksanakan penyekatan dengan cara yang sangat mudah dan intuitif. Dalam artikel ini, kita akan menyelidiki cara mekanisme penyekatan dilaksanakan di Golang.

Pertama, kita perlu memahami apa itu menyekat. Menyekat bermakna apabila tugasan berada dalam keadaan menunggu dan tidak dapat meneruskan ke langkah seterusnya, sistem atau utas disekat. Apabila sistem atau utas disekat, ia tidak boleh bertindak balas kepada sebarang permintaan atau operasi sehingga blok itu dikeluarkan.

Di Golang, cara kami melaksanakan sekatan adalah dengan menunggu goroutine melengkapkan atau menerima data daripada saluran. Mari kita lihat pelaksanaan kaedah ini:

Menunggu goroutine selesai

Goroutine ialah ciri penting Golang, yang membolehkan kami mencipta benang ringan yang boleh melaksanakan pelbagai tugas di masa yang sama. Di Golang, kita boleh menggunakan goroutine untuk melaksanakan operasi serentak. Apabila menggunakan goroutine, kita perlu menunggu mereka menyelesaikan tugas mereka.

Untuk menunggu goroutine menyelesaikan tugas, kita boleh menggunakan WaitGroup di Golang. WaitGroup ialah semaphore mengira Apabila nilainya ialah 0, goroutine akan terus dilaksanakan. Kita boleh menggunakan kaedah Tambah() untuk menambah tugasan, kaedah Selesai() untuk mengurangkan kiraan tugas, dan kemudian gunakan kaedah Tunggu() untuk menunggu semua tugasan selesai.

Berikut ialah contoh kod yang menggunakan WaitGroup untuk menunggu goroutine selesai:

package main

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

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 5; i++ {
        wg.Add(1)
        go func(i int) {
            defer wg.Done()
            time.Sleep(time.Second)
            fmt.Println("goroutine ", i, "done")
        }(i)
    }
    wg.Wait()
    fmt.Println("all goroutines done")
}

Dalam kod di atas, kami menggunakan WaitGroup untuk menunggu 5 goroutine untuk menyelesaikan tugas. Kami menggunakan kaedah Add() untuk menambah tugas, dan kemudian menggunakan kaedah Done() untuk mengurangkan kiraan tugas selepas pelaksanaan goroutine selesai. Akhir sekali, kami menggunakan kaedah Tunggu() untuk menunggu semua gorout menyelesaikan tugas mereka.

Terima data saluran

Di Golang, kami juga boleh menggunakan saluran untuk melaksanakan mekanisme penyekatan. Saluran ialah struktur data khas yang digunakan untuk menghantar data antara goroutine. Di Golang, kita boleh menggunakan penyata pilih untuk menunggu data saluran.

Berikut ialah contoh kod yang menggunakan saluran untuk menunggu data:

package main

import (
    "fmt"
    "time"
)

func main() {
    ch := make(chan string)
    go func() {
        time.Sleep(time.Second)
        ch <- "goroutine done"
    }()
    select {
    case res := <-ch:
        fmt.Println(res)
    case <-time.After(time.Second * 2):
        fmt.Println("timeout")
    }
}

Dalam kod di atas, kami mencipta saluran ch dan menggunakan goroutine untuk memasukkan data ke saluran. Kemudian, kami menggunakan pernyataan pilih untuk menunggu data daripada saluran. Jika tiada data diterima dalam tempoh masa tertentu, cawangan tamat masa akan dicetuskan.

Di atas ialah contoh penggunaan WaitGroup dan saluran untuk melaksanakan penyekatan di Golang. Dalam pembangunan sebenar, kita boleh memilih kaedah penyekatan yang sesuai mengikut keperluan.

Ringkasnya, Golang menyediakan pelbagai cara untuk melaksanakan penyekatan. Kita boleh menggunakan WaitGroup untuk menunggu goroutine menyelesaikan tugas, atau kita boleh menggunakan pernyataan pilih untuk menunggu data saluran. Menggunakan kaedah ini, kami boleh melaksanakan mekanisme penyekatan dengan mudah di Golang untuk menulis aplikasi berkonkurensi tinggi dan ketersediaan tinggi.

Atas ialah kandungan terperinci Menyelam mendalam tentang cara mekanisme penyekatan dilaksanakan di 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