Dalam dunia pembangunan perisian hari ini, menangani konkurensi adalah isu yang sering perlu dipertimbangkan oleh pengaturcara. Dengan perkembangan pesat perkakasan mesin, penggunaan pemproses berbilang teras telah menjadi semakin biasa, jadi pemprosesan serentak menjadi semakin penting dalam prestasi dan kebolehskalaan sistem perisian. Antara bahasa pengaturcaraan hari ini, bahasa Go telah menjadi pilihan yang semakin popular, dan model konkurensi yang berkuasa menjadikannya pilihan yang sangat baik. Walau bagaimanapun, model konkurensinya tidak berdasarkan benang dan kunci tradisional, tetapi berdasarkan coroutine dan komunikasi. Jadi, artikel ini akan memperkenalkan dan menerangkan model konkurensi dalam bahasa Go.
Goroutines ialah coroutine dalam bahasa Go. Ia boleh dilaksanakan secara selari dalam proses, dan setiap goroutine dilaksanakan dalam urutan mengikut masa jalan bahasa Go. Berbanding dengan benang OS, Goroutines lebih ringan dan mempunyai overhed yang lebih sedikit apabila memulakan dan memusnahkan. Apabila menggunakan Goroutines, hanya gunakan kata kunci go untuk memulakan Goroutine:
go doSomething()
Di sini, fungsi doSomething() akan dijalankan sebagai Goroutine.
Saluran ialah mekanisme komunikasi dalam bahasa Go. Ia digunakan untuk menghantar data dan menyegerakkan antara Goroutines, dengan itu mengelakkan pertengkaran dan kunci. Saluran datang dalam dua jenis: buffered dan unbuffered. Untuk saluran buffered, data yang disimpan boleh dicache apabila tiada penerima saluran hanya boleh menghantar dan menerima data apabila kedua-dua penghantar dan penerima sudah bersedia. Untuk mencipta saluran tidak buffer, gunakan sintaks berikut:
c := make(chan int)
Apabila mengakses saluran, anda boleh menggunakan operator <- untuk menghantar atau menerima:
c <- 10 // 发送 x := <-c // 接收
Select ialah pernyataan dalam Go, digunakan untuk mengendalikan operasi pada berbilang saluran. Ia boleh mendengar berbilang saluran pada masa yang sama dan melakukan operasi yang sepadan untuk mengelakkan sekatan Goroutines. Apabila berbilang saluran mempunyai data, saluran rawak dipilih untuk melaksanakan pernyataan.
select { case a := <-chan1: // 处理 chan1 中的数据 case b := <-chan2: // 处理 chan2 中的数据 default: // 当 chan1 和 chan2 中都没有数据时的操作 }
WaitGroup ialah binaan segerak dalam Go yang menunggu sekumpulan Goroutines selesai. Ia menyediakan titik penyegerakan untuk mengawal Goroutines dan mengelakkan perlumbaan dalam situasi serentak. Apabila menggunakan WaitGroup, anda boleh menunjukkan bilangan Goroutine yang akan dilaksanakan dengan menggunakan kaedah Add() Apabila setiap Goroutine dilaksanakan, kaedah Done() dipanggil untuk memberitahu WaitGroup bahawa ia telah selesai dan kaedah Wait(). akan menunggu sehingga semua Goroutine selesai:
var wg sync.WaitGroup for _, item := range items { wg.Add(1) go func(item int) { // 处理 item wg.Done() }(item) } wg.Wait()
Mutex ialah primitif penyegerakan dalam Go yang digunakan untuk menyediakan akses eksklusif antara dua Goroutine. Ia menyediakan keupayaan mengunci data untuk mengelakkan perbalahan dan kebuntuan daripada berlaku. Mutex boleh mengunci dan mengeluarkan data melalui kaedah Lock() dan Unlock():
var mutex sync.Mutex ... mutex.Lock() x++ mutex.Unlock()
Melalui pengenalan di atas, kita dapat melihat bahawa model konkurensi dalam bahasa Go sangat berkuasa dan fleksibel. Dengan menggunakan mekanisme ini, pembangun boleh melaksanakan konkurensi dengan mudah dan mengelakkan kunci dan perbalahan, dengan itu meningkatkan prestasi perisian dan kebolehskalaan. Pada masa yang sama, berbanding dengan benang dan kunci tradisional, model konkurensi dalam Go adalah lebih ringkas dan selamat untuk digunakan serta kodnya lebih jelas dan mudah difahami.
Atas ialah kandungan terperinci Apakah model konkurensi dalam bahasa Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!