Go での同時処理に Goroutine を使用する方法

Linda Hamilton
リリース: 2024-10-12 06:31:02
オリジナル
566 人が閲覧しました

How to Use Goroutines for Concurrent Processing in Go

Concurrency ialah salah satu ciri penentu Go, menjadikannya bahasa yang hebat untuk membina aplikasi berskala dan berprestasi tinggi. Dalam siaran ini, kami akan meneroka Groutines, yang membolehkan anda menjalankan fungsi serentak dalam Go, memberikan aplikasi anda peningkatan kecekapan yang serius. Sama ada anda bekerja pada pelayan web, pemproses data atau apa-apa jenis aplikasi lain, Goroutines boleh membantu anda melakukan lebih banyak dengan kurang.

Ini perkara yang akan kami bincangkan:

  • Apakah itu Goroutine dan cara ia berfungsi.
  • Cara mencipta dan menggunakan Goroutines.
  • Menyegerakkan Goroutine dengan WaitGroups dan Saluran.
  • Perangkap biasa dan amalan terbaik untuk bekerja dengan Goroutines.

Jom mulakan! ?


Apakah itu Goroutines? ?

Groutine ialah utas ringan yang diuruskan oleh masa jalan Go, membolehkan anda menjalankan fungsi secara serentak. Tidak seperti benang peringkat OS, Goroutines jauh lebih murah dan lebih cekap. Anda boleh melahirkan ribuan Goroutine tanpa membebankan sistem anda, menjadikannya sesuai untuk tugasan serentak.

Ciri-ciri Utama:

  • Cekap: Goroutine menggunakan memori yang minimum dan bermula dengan cepat.
  • Pelaksanaan Serentak: Mereka boleh menjalankan berbilang fungsi pada masa yang sama, membantu anda mengendalikan tugas secara selari.
  • Mudah Digunakan: Anda tidak perlu berurusan dengan logik benang yang rumit.

Mencipta dan Menggunakan Goroutines

Membuat Goroutine adalah sangat mudah: hanya gunakan kata kunci go sebelum panggilan fungsi. Mari lihat contoh pantas.

Contoh Asas:

package main

import (
    "fmt"
    "time"
)

func printMessage(message string) {
    for i := 0; i < 5; i++ {
        fmt.Println(message)
        time.Sleep(500 * time.Millisecond)
    }
}

func main() {
    go printMessage("Hello from Goroutine!")  // This runs concurrently
    printMessage("Hello from main!")
}
ログイン後にコピー

Dalam contoh ini, printMessage dipanggil sebagai Goroutine dengan go printMessage("Hello from Goroutine!"), yang bermaksud ia akan dijalankan serentak dengan fungsi utama.


Menyegerakkan Goroutines dengan WaitGroups

Memandangkan Goroutines berjalan serentak, mereka boleh menamatkan dalam sebarang susunan. Untuk memastikan semua Goroutine selesai sebelum meneruskan, anda boleh menggunakan WaitGroup daripada pakej penyegerakan Go.

Contoh dengan WaitGroup:

package main

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

func printMessage(message string, wg *sync.WaitGroup) {
    defer wg.Done() // Notify WaitGroup that the Goroutine is done
    for i := 0; i < 5; i++ {
        fmt.Println(message)
        time.Sleep(500 * time.Millisecond)
    }
}

func main() {
    var wg sync.WaitGroup

    wg.Add(1)
    go printMessage("Hello from Goroutine!", &wg)

    wg.Add(1)
    go printMessage("Hello again!", &wg)

    wg.Wait()  // Wait for all Goroutines to finish
    fmt.Println("All Goroutines are done!")
}
ログイン後にコピー

Di sini, kami menambahkan wg.Add(1) untuk setiap Goroutine dan memanggil wg.Done() apabila Goroutine selesai. Akhir sekali, wg.Wait() menjeda fungsi utama sehingga semua Goroutines selesai.


Berkomunikasi Antara Goroutine dengan Saluran

Saluran ialah cara terbina dalam Go untuk Goroutines berkomunikasi. Mereka membenarkan anda menghantar data dengan selamat antara Goroutines, memastikan tiada perlumbaan data berlaku.

Contoh Saluran Asas:

package main

import (
    "fmt"
)

func sendData(channel chan string) {
    channel <- "Hello from the channel!"
}

func main() {
    messageChannel := make(chan string)

    go sendData(messageChannel)

    message := <-messageChannel  // Receive data from the channel
    fmt.Println(message)
}
ログイン後にコピー

Dalam contoh ini, sendData menghantar mesej ke messageChannel dan fungsi utama menerimanya. Saluran membantu menyegerakkan Goroutines dengan menyekat sehingga kedua-dua pengirim dan penerima bersedia.

Menggunakan Saluran Penampan

Anda juga boleh mencipta saluran penimbal yang membenarkan bilangan nilai yang ditetapkan disimpan dalam saluran sebelum ia disekat. Ini berguna apabila anda ingin mengurus aliran data tanpa perlu menyegerakkan setiap Goroutine.

func main() {
    messageChannel := make(chan string, 2)  // Buffered channel with capacity of 2

    messageChannel <- "Message 1"
    messageChannel <- "Message 2"
    // messageChannel <- "Message 3" // This would block as the buffer is full

    fmt.Println(<-messageChannel)
    fmt.Println(<-messageChannel)
}
ログイン後にコピー

Saluran buffer menambah sedikit lebih fleksibiliti, tetapi penting untuk mengurus saiz penimbal dengan berhati-hati untuk mengelakkan kebuntuan.


Perangkap Biasa dan Amalan Terbaik

  1. Elakkan Menyekat Goroutine: Jika Goroutine menghalang dan tiada cara untuk membebaskannya, anda akan mendapat jalan buntu. Gunakan saluran atau pembatalan konteks untuk mengelakkan perkara ini.

  2. Gunakan pilih dengan Saluran: Apabila bekerja dengan berbilang saluran, pernyataan pilihan membolehkan anda mengendalikan mana-mana saluran yang sedia dahulu, mengelakkan kemungkinan sekatan.

   select {
   case msg := <-channel1:
       fmt.Println("Received from channel1:", msg)
   case msg := <-channel2:
       fmt.Println("Received from channel2:", msg)
   default:
       fmt.Println("No data received")
   }
ログイン後にコピー
  1. Tutup Saluran Dengan Betul: Menutup saluran memberi isyarat bahawa tiada lagi data akan dihantar, yang berguna untuk menunjukkan apabila Goroutine selesai menghantar data.
   close(messageChannel)
ログイン後にコピー
  1. Pantau Penggunaan Memori: Memandangkan Goroutines sangat ringan, mudah untuk menghasilkan terlalu banyak. Pantau penggunaan memori aplikasi anda untuk mengelak daripada membebankan sistem.

  2. Gunakan Konteks untuk Pembatalan: Apabila anda perlu membatalkan Goroutines, gunakan pakej konteks Go untuk menyebarkan isyarat pembatalan.

   ctx, cancel := context.WithCancel(context.Background())
   defer cancel()

   go func(ctx context.Context) {
       for {
           select {
           case <-ctx.Done():
               return
           default:
               // Continue processing
           }
       }
   }(ctx)
ログイン後にコピー

Fikiran Akhir

Groutine ialah ciri yang berkuasa dalam Go, menjadikan pengaturcaraan serentak boleh diakses dan berkesan. Dengan memanfaatkan Goroutines, WaitGroups dan Channels, anda boleh membina aplikasi yang mengendalikan tugas secara serentak, skala dengan cekap dan menggunakan sepenuhnya pemproses berbilang teras moden.

試してみる: 独自のプロジェクトでゴルーチンを試してみましょう!一度コツを掴めば、Go アプリケーションにまったく新しい可能性の世界が開かれることがわかるでしょう。コーディングを楽しんでください! ?


ゴルーチンのお気に入りの使用例は何ですか? コメントで知らせたり、ゴルーチンを効果的に使用するためのその他のヒントがあれば共有してください!

以上がGo での同時処理に Goroutine を使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート