Tulis chan secara serentak.WaitGroup goroutine
Editor PHP Youzi akan memperkenalkan kaedah menulis chan secara sync.WaitGroup goroutine. Dalam pengaturcaraan serentak, sync.WaitGroup ialah mekanisme penyegerakan yang sangat berguna yang boleh menunggu pelaksanaan sekumpulan goroutin selesai. Walau bagaimanapun, kadangkala kita perlu menulis keputusan kepada chan selepas goroutine menyelesaikan pelaksanaan untuk penggunaan oleh goroutine lain. Artikel ini akan memperkenalkan secara terperinci cara melaksanakan fungsi ini secara segerak. WaitGroup goroutine, mari lihat!
Kandungan soalan
Saya mendapat senarai item daripada titik akhir API. Kemudian, untuk setiap projek, saya membuat permintaan API lain untuk mendapatkan data tentang projek individu.
Saya tidak boleh membuat permintaan API kedua untuk setiap projek pada masa yang sama kerana token API saya adalah terhad dan jika saya membuat terlalu banyak permintaan pada masa yang sama, saya akan terbantut.
Walau bagaimanapun, data tindak balas API awal boleh dibahagikan kepada beberapa halaman, yang membolehkan saya memproses halaman data secara serentak.
Selepas beberapa penyelidikan, kod di bawah melakukan apa yang saya mahukan:
func main() { // pretend paginated results from initial API request page1 := []int{1, 2, 3} page2 := []int{4, 5, 6} page3 := []int{7, 8, 9} pages := [][]int{page1, page2, page3} results := make(chan string) var wg sync.WaitGroup for i := range pages { wg.Add(1) go func(i int) { defer wg.Done() for j := range pages[i] { // simulate making additional API request and building the report time.Sleep(500 * time.Millisecond) result := fmt.Sprintf("Finished creating report for %d", pages[i][j]) results <- result } }(i) } go func() { wg.Wait() close(results) }() for result := range results { fmt.Println(result) } }
Saya ingin memahami mengapa ia berfungsi:
go func() { wg.Wait() close(results) }()
Percubaan pertama saya tidak berjaya - saya fikir saya boleh membaca hasilnya apabila wg.Wait()
之后遍历通道,并且我会在结果写入 results
saluran.
func main() { // pretend paginated results from initial API request page1 := []int{1, 2, 3} page2 := []int{4, 5, 6} page3 := []int{7, 8, 9} pages := [][]int{page1, page2, page3} results := make(chan string) var wg sync.WaitGroup for i := range pages { wg.Add(1) go func(i int) { defer wg.Done() for j := range pages[i] { // simulate making additional API request and building the report time.Sleep(500 * time.Millisecond) result := fmt.Sprintf("Finished creating report for %d", pages[i][j]) results <- result } }(i) } // does not work wg.Wait() close(results) for result := range results { fmt.Println(result) } }
Penyelesaian
Pada percubaan pertama anda:
- Groutine utama menjadikan 3 goroutine meletakkan nilai ke dalam saluran hasil.
- Coroutine utama menunggu semua coroutine selesai.
- Salah satu goroutine meletakkan nilai ke dalam saluran hasil dan mengisi saluran (saiz saluran ialah 1 rentetan).
- Kini ketiga-tiga goroutin tidak lagi boleh meletakkan nilai ke dalam saluran hasil dan tidur sehingga saluran keputusan dikeluarkan.
- Semua gorouti dalam keadaan tidur. Anda sedang menemui jalan buntu.
Pada percubaan kedua:
- Groutine utama mengandungi 4 goroutine.
- 3 gorout untuk meletakkan nilai ke dalam saluran hasil.
- Groutine yang satu lagi (saya panggil yang ke-4) menunggu sehingga 3 goroutine ini habis.
- Pada masa yang sama, coroutine utama menunggu nilai dalam saluran hasil (untuk gelung)
- Dalam kes ini, jika salah satu goroutine meletakkan nilai dalam saluran hasil, ia menyekat baki tiga goroutin yang mengeluarkan nilai daripada saluran hasil, dengan itu menyahsekat goroutin yang lain.
- Jadi kesemua 3 goroutine meletakkan nilai masing-masing dan berakhir
- Kemudian goroutine keempat menutup saluran
- Gourutine utama menamatkannya untuk gelung.
Atas ialah kandungan terperinci Tulis chan secara serentak.WaitGroup goroutine. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Terdapat hubungan ibu bapa-anak antara fungsi dan goroutine dalam Go Gooutine induk mencipta goroutine kanak-kanak, dan goroutine kanak-kanak boleh mengakses pembolehubah goroutine induk tetapi bukan sebaliknya. Buat goroutine kanak-kanak menggunakan kata kunci go, dan goroutine kanak-kanak dilaksanakan melalui fungsi tanpa nama atau fungsi bernama. Goroutine induk boleh menunggu goroutine anak selesai melalui penyegerakan.WaitGroup untuk memastikan program tidak keluar sebelum semua goroutine kanak-kanak selesai.

Fungsi digunakan untuk melaksanakan tugas secara berurutan dan mudah dan mudah digunakan, tetapi mereka mempunyai masalah dengan penyekatan dan kekangan sumber. Goroutine ialah utas ringan yang melaksanakan tugas secara serentak. Ia mempunyai keupayaan serentak, berskala dan pemprosesan acara yang tinggi, tetapi ia adalah rumit untuk digunakan, mahal dan sukar untuk dinyahpepijat. Dalam pertempuran sebenar, Goroutine biasanya mempunyai prestasi yang lebih baik daripada fungsi apabila melakukan tugas serentak.

Dalam persekitaran berbilang benang, gelagat fungsi PHP bergantung pada jenisnya: Fungsi biasa: thread-safe, boleh dilaksanakan secara serentak. Fungsi yang mengubah suai pembolehubah global: tidak selamat, perlu menggunakan mekanisme penyegerakan. Fungsi operasi fail: tidak selamat, perlu menggunakan mekanisme penyegerakan untuk menyelaraskan akses. Fungsi operasi pangkalan data: Mekanisme sistem pangkalan data yang tidak selamat perlu digunakan untuk mengelakkan konflik.

Kaedah untuk komunikasi antara benang dalam C++ termasuk: memori dikongsi, mekanisme penyegerakan (kunci mutex, pembolehubah keadaan), paip dan baris gilir mesej. Contohnya, gunakan kunci mutex untuk melindungi pembilang yang dikongsi: mengisytiharkan kunci mutex (m) dan pembolehubah yang dikongsi (pembilang); untuk mengelakkan keadaan perlumbaan.

Baru-baru ini di pasaran utama, trek terhangat sudah pasti AI, diikuti oleh BTC 80% daripada projek yang dibincangkan setiap hari tertumpu pada dua trek ini Paling banyak, saya boleh bercakap tentang 5 atau 6 projek AI. Boleh diramalkan bahawa gelembung AI akan mencapai kemuncaknya pada tahun hadapan Dengan beratus-ratus projek AI baharu datang dalam talian, nilai pasaran trek AI akan mencapai kemuncaknya apabila gelembung itu akhirnya meletus hilang, industri sebenar akan lahir Unicorn yang menemui titik kesesuaian AIXCrypto akan terus mendorong trek ini dan seluruh industri ke hadapan. Oleh itu, dalam persekitaran AI yang terlalu panas semasa, kita perlu bertenang dan melihat perubahan yang berlaku di peringkat Infra dalam beberapa bulan kebelakangan ini, terutamanya trek Infra rantaian awam Beberapa perkara baharu patut disebut. 1.ET

Rangka kerja pengaturcaraan serentak C++ menampilkan pilihan berikut: utas ringan (std::benang-benang Boost concurrency concurrency dan algoritma OpenMP untuk pemproses berbilang pemproses berprestasi tinggi (TBB); (cpp-Setuju).

Kaedah pengoptimuman prestasi program termasuk: Pengoptimuman algoritma: Pilih algoritma dengan kerumitan masa yang lebih rendah dan mengurangkan gelung dan pernyataan bersyarat. Pemilihan struktur data: Pilih struktur data yang sesuai berdasarkan corak akses data, seperti pepohon carian dan jadual cincang. Pengoptimuman memori: elakkan mencipta objek yang tidak diperlukan, lepaskan memori yang tidak lagi digunakan dan gunakan teknologi kumpulan memori. Pengoptimuman benang: mengenal pasti tugas yang boleh diselaraskan dan mengoptimumkan mekanisme penyegerakan benang. Pengoptimuman pangkalan data: Cipta indeks untuk mempercepatkan pengambilan data, mengoptimumkan pernyataan pertanyaan dan menggunakan pangkalan data cache atau NoSQL untuk meningkatkan prestasi.

Kata kunci yang tidak menentu digunakan untuk mengubah suai pembolehubah untuk memastikan semua utas dapat melihat nilai terkini pembolehubah dan untuk memastikan bahawa pengubahsuaian pembolehubah adalah operasi yang tidak terganggu. Senario aplikasi utama termasuk pembolehubah kongsi berbilang benang, halangan memori dan pengaturcaraan serentak. Walau bagaimanapun, perlu diingatkan bahawa tidak menentu tidak menjamin keselamatan benang dan boleh mengurangkan prestasi Ia hanya boleh digunakan apabila benar-benar perlu.
