Idea pengoptimuman dan kaedah Goroutines dalam amalan pengaturcaraan serentak Golang

WBOY
Lepaskan: 2023-07-17 08:27:06
asal
1111 orang telah melayarinya

Idea dan kaedah pengoptimuman Goroutines di Golang amalan pengaturcaraan serentak

Pengenalan:
Dengan pembangunan berterusan perkakasan komputer, pemproses teras tunggal tidak lagi dapat memenuhi keperluan semasa untuk pemprosesan data berskala besar dan keperluan serentak. Oleh itu, pengaturcaraan serentak menjadi semakin penting. Sebagai bahasa yang menyokong pengaturcaraan serentak, Goroutine dan mekanisme saluran terbina dalam Golang menyediakan alat yang berkuasa untuk pengaturcaraan serentak. Walau bagaimanapun, disebabkan overhed pensuisan yang tinggi bagi Goroutines Golang, jika Goroutines digunakan tanpa pengoptimuman, ia akan menyebabkan kesesakan prestasi. Artikel ini akan meneroka idea dan kaedah pengoptimuman Goroutines di Golang.

1. Penggunaan asas Goroutines
Di Golang, anda boleh membuat Goroutine melalui kata kunci "go". Berikut ialah contoh mudah:

package main

import (
    "fmt"
)

func main() {
    go hello()
    fmt.Println("main function")
}

func hello() {
    fmt.Println("Hello, Goroutine!")
}
Salin selepas log masuk

Dalam kod di atas, Goroutine dimulakan oleh go hello(). Goroutine dilaksanakan selari dengan utas utama, jadi anda boleh melihat bahawa "Hello, Goroutine!" dan "fungsi utama" muncul secara berselang-seli dalam output.

2. Idea dan kaedah pengoptimuman Goroutines

  1. Kurangkan bilangan ciptaan dan masa penukaran Goroutines
    Penciptaan dan penukaran Goroutines akan membawa sejumlah overhed, jadi mengurangkan bilangan penciptaan dan masa penukaran Goroutines adalah idea pengoptimuman. Ini boleh dicapai dengan:
  2. Satukan tugas atau pengiraan kecil ke dalam satu Goroutine untuk mengelakkan penciptaan dan penukaran Goroutine yang berlebihan.
  3. Gunakan sync.WaitGroup untuk menunggu semua Goroutine selesai melaksanakan sebelum meneruskan ke langkah seterusnya.

Berikut ialah contoh kod:

package main

import (
    "fmt"
    "sync"
)

func main() {
    var wg sync.WaitGroup
    wg.Add(2)
    go func() {
        defer wg.Done()
        for i := 0; i < 1000; i++ {
            fmt.Println("Goroutine1: ", i)
        }
    }()

    go func() {
        defer wg.Done()
        for i := 0; i < 1000; i++ {
            fmt.Println("Goroutine2: ", i)
        }
    }()

    wg.Wait()
    fmt.Println("main function")
}
Salin selepas log masuk

Dalam kod di atas, sync.WaitGroup digunakan untuk menunggu dua Goroutine selesai melaksanakan sebelum melaksanakan utas utama. Dengan menggabungkan tugasan ke dalam sebilangan kecil Goroutines dan menggunakan sync.WaitGroup untuk melaksanakannya secara serentak, bilangan penciptaan dan penukaran Goroutines boleh dikurangkan.

  1. Gunakan Kolam Goroutines
    Penciptaan dan pemusnahan Goroutines akan membawa overhed tambahan, jadi anda boleh menggunakan kolam Goroutines untuk menggunakan semula Goroutines sedia ada untuk mengelakkan penciptaan dan pemusnahan Goroutines yang kerap. Pengumpulan Goroutines boleh dilaksanakan menggunakan saluran. Berikut ialah contoh kod:
package main

import (
    "fmt"
)

func main() {
    pool := make(chan bool, 10) // 创建一个容量为10的Goroutines池
    for i := 0; i < 1000; i++ {
        pool <- true
        go func(n int) {
            defer func() {
                <-pool
            }()
            fmt.Println("Goroutine: ", n)
        }(i)
    }

    for i := 0; i < cap(pool); i++ {
        pool <- true
    }

    fmt.Println("main function")
}
Salin selepas log masuk

Dalam kod di atas, kolam Goroutines dengan kapasiti 10 dicipta. Selepas setiap Goroutine dilaksanakan, semaphore akan dikeluarkan melalui saluran, menunjukkan bahawa Goroutine tersedia. Dengan menggunakan semula Goroutines sedia ada, bilangan penciptaan dan pemusnahan Goroutines dapat dikurangkan.

  1. Pembahagian tugas dan komunikasi data
    Pembahagian tugas yang munasabah dan penyelarasan serta komunikasi data juga merupakan kaedah pengoptimuman Goroutines. Dengan membahagikan tugas, tugas besar boleh diuraikan kepada beberapa tugas kecil untuk meningkatkan prestasi serentak. Pada masa yang sama, melalui mekanisme saluran yang disediakan oleh Golang, komunikasi data antara Goroutine yang berbeza boleh dicapai. Berikut ialah contoh kod:
package main

import (
    "fmt"
)

func main() {
    tasks := make(chan int, 100) // 创建一个容量为100的任务通道
    results := make(chan int, 100) // 创建一个容量为100的结果通道

    go produceTasks(tasks) // 生成任务
    for i := 0; i < 10; i++ {
        go consumeTasks(tasks, results) // 消费任务
    }

    showResults(results) // 显示结果
    fmt.Println("main function")
}

func produceTasks(tasks chan<- int) {
    for i := 0; i < 100; i++ {
        tasks <- i
    }
    close(tasks)
}

func consumeTasks(tasks <-chan int, results chan<- int) {
    for task := range tasks {
        results <- task * task
    }
}

func showResults(results <-chan int) {
    for result := range results {
        fmt.Println("Result: ", result)
    }
}
Salin selepas log masuk

Dalam kod di atas, 100 tugas dijana melalui fungsi produceTasks() dan dihantar ke saluran tugas, dan kemudian tugasan diperoleh daripada saluran tugas melalui Goroutines pengguna (consumeTasks() fungsi) dan Proses dan hantar keputusan ke saluran keputusan. Akhir sekali, semua keputusan dipaparkan dalam fungsi showResults(). Melalui pembahagian tugas dan komunikasi data, prestasi konkurensi dan kebolehbacaan kod boleh dipertingkatkan.

Ringkasan:
Pengaturcaraan serentak Golang adalah salah satu ciri pentingnya Melalui penggunaan munasabah Goroutines dan mekanisme saluran, pengaturcaraan serentak boleh dicapai dengan cekap. Artikel ini memperkenalkan penggunaan asas, idea pengoptimuman dan kaedah Goroutines, termasuk mengurangkan bilangan penciptaan dan masa penukaran Goroutines, menggunakan kumpulan Goroutines dan pembahagian tugas serta kaedah komunikasi data. Saya harap ia akan membantu pembangun lebih memahami dan menggunakan pengaturcaraan serentak Golang.

Atas ialah kandungan terperinci Idea pengoptimuman dan kaedah Goroutines dalam amalan pengaturcaraan serentak Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
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