Pertandingan pengaturcaraan dan sumber yang sangat serentak dalam bahasa Go

PHPz
Lepaskan: 2023-06-01 08:03:24
asal
919 orang telah melayarinya

Dengan perkembangan pesat Internet dan Internet mudah alih, semakin banyak aplikasi yang perlu mengendalikan permintaan serentak yang tinggi telah menjadi satu cabaran bagi pembangun. Bahasa Go telah menjadi bahasa pilihan dalam senario konkurensi tinggi kerana mekanisme pemprosesan serentak yang cekap dan ciri bahasa yang mudah digunakan. Artikel ini akan memperkenalkan pengetahuan berkaitan pengaturcaraan konkurensi tinggi dan persaingan sumber dalam bahasa Go.

1. Pengaturcaraan serentak dalam bahasa Go

Pengaturcaraan serentak dalam bahasa Go dilaksanakan melalui goroutine. Goroutine ialah benang ringan yang boleh berjalan pada timbunan kecil Ia dimulakan dan dimusnahkan dengan cepat Ia boleh menjalankan beribu-ribu goroutine pada masa yang sama untuk mencapai kesesuaian yang tinggi. Berikut ialah contoh goroutine mudah:

func main() {
    go func() {
        // goroutine逻辑
    }()
}
Salin selepas log masuk

Satu lagi ciri yang sangat penting dalam pengaturcaraan serentak dalam bahasa Go ialah saluran, yang merupakan jambatan untuk komunikasi antara goroutine. Saluran ialah baris gilir selamat benang yang menyokong penyegerakan dan pengecualian bersama antara gorouti yang berbeza. Pelaksanaan saluran mudah adalah seperti berikut:

func main() {
    ch := make(chan int)
    go func() {
        // goroutine逻辑
        ch <- 1
    }()
    <-ch
}
Salin selepas log masuk

Dalam kod di atas, saluran ch mula-mula dibuat, kemudian goroutine dimulakan, beberapa logik dilaksanakan di dalamnya, dan hasilnya dihantar ke saluran melalui ch , dan akhirnya fungsi utama Tunggu goroutine selesai melaksanakan melalui operasi terima (<-ch) sebelum tamat.

2. Pertandingan sumber

Dalam persekitaran berbilang benang, persaingan sumber adalah masalah biasa. Dalam bahasa Go, mengakses pembolehubah kongsi boleh menyebabkan perbalahan sumber kerana berbilang goroutine boleh mengakses pembolehubah kongsi yang sama pada masa yang sama, yang membawa kepada hasil yang tidak dapat diramalkan.

Berikut ialah kod tunjuk cara mudah:

func main() {
    var count int
    for i := 0; i < 10000; i++ {
        go func() {
            count++
        }()
    }
    fmt.Println("count:", count)
}
Salin selepas log masuk

Dalam kod di atas, 10,000 goroutine dimulakan dan setiap goroutine akan menambah satu pada kiraan pembolehubah yang dikongsi. Walau bagaimanapun, oleh kerana perintah pelaksanaan goroutine tidak pasti, keputusan akhir juga tidak pasti. Dalam ujian tempatan, kadangkala hasil kiraan ialah 9996, kadangkala 9998, dan kadangkala 10000.

Untuk mengelakkan situasi ini, kita perlu menggunakan mekanisme kunci yang disediakan dalam bahasa Go untuk mengunci dan membuka kunci pembolehubah kongsi untuk memastikan hanya satu goroutine boleh mengendalikan pembolehubah yang dikongsi pada masa yang sama. Berikut ialah kod sampel yang dipertingkatkan:

func main() {
    var count int
    mu := sync.Mutex{}
    for i := 0; i < 10000; i++ {
        go func() {
            mu.Lock()
            count++
            mu.Unlock()
        }()
    }
    time.Sleep(time.Second) // 等待goroutine执行完毕
    fmt.Println("count:", count)
}
Salin selepas log masuk

Dalam kod di atas, kami menggunakan jenis Mutex yang disediakan oleh pakej penyegerakan untuk mengunci (mu.Lock()) dan membuka kunci (mu. Unlock()) operasi untuk memastikan bahawa hanya satu goroutine boleh beroperasi pada pembolehubah yang dikongsi pada masa yang sama. Untuk memastikan semua goroutine dilaksanakan, di sini kita menunggu selama 1 saat melalui fungsi Tidur yang disediakan oleh pakej masa.

3. Langkah berjaga-jaga untuk pengaturcaraan serentak tinggi

Dalam pengaturcaraan serentak tinggi, anda perlu memberi perhatian kepada perkara berikut:

  1. Elakkan menggunakan sumber yang dikongsi seperti sebagai pembolehubah global Cuba gunakan sumber persendirian seperti pembolehubah tempatan.
  2. Gunakan mekanisme kunci mutex untuk memastikan akses kepada sumber yang dikongsi tidak menyebabkan persaingan.
  3. Cuba gunakan mekanisme penguncian berbutir halus seperti kunci baca-tulis dan elakkan menggunakan mekanisme penguncian berbutir kasar untuk meningkatkan prestasi serentak.
  4. Gunakan mekanisme penyegerakan seperti saluran untuk memastikan penyelarasan yang betul antara goroutine.
  5. Elakkan membuat terlalu banyak goroutin, kurangkan overhed goroutine sebanyak mungkin, dan tingkatkan responsif dan daya pemprosesan sistem.

4. Kesimpulan

Bahasa Go secara beransur-ansur menjadi bahasa pilihan dalam senario konkurensi tinggi kerana mekanisme pemprosesan serentak yang cekap dan ciri bahasa yang ringkas dan mudah digunakan. Dalam pengaturcaraan konkurensi tinggi, anda perlu memberi perhatian kepada isu persaingan sumber, dan memastikan penyelarasan yang betul antara berbilang goroutine melalui mekanisme kunci mutex dan mekanisme penyegerakan. Pada masa yang sama, adalah perlu untuk mengelak daripada mencipta terlalu banyak goroutine dan mempertingkatkan responsif dan daya pemprosesan sistem sebanyak mungkin untuk memenuhi keperluan perniagaan yang semakin berkembang.

Atas ialah kandungan terperinci Pertandingan pengaturcaraan dan sumber yang sangat serentak dalam bahasa Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan