Rumah >pembangunan bahagian belakang >Golang >Tutorial Asas Pengaturcaraan Serentak Golang: Daripada Bermula dengan Goroutines kepada Aplikasi Praktikal

Tutorial Asas Pengaturcaraan Serentak Golang: Daripada Bermula dengan Goroutines kepada Aplikasi Praktikal

王林
王林asal
2023-07-18 20:34:561123semak imbas

Tutorial Asas Pengaturcaraan Serentak Golang: Daripada Bermula dengan Goroutine ke Aplikasi Praktikal

Pengenalan:
Dengan perkembangan pesat Internet, permintaan untuk pemprosesan serentak yang cekap juga meningkat dari hari ke hari. Sebagai bahasa pengaturcaraan yang pantas dan cekap, Golang terkenal dengan sokongan serentak yang berkuasa. Artikel ini akan memperkenalkan pengetahuan asas pengaturcaraan serentak di Golang, daripada bermula dengan Goroutines kepada aplikasi praktikal.

1. Apakah itu Goroutine?
Goroutine ialah benang ringan di Golang yang boleh berjalan serentak dengan Goroutine lain. Kos untuk mencipta dan memusnahkan Goroutine adalah sangat rendah, jadi beribu-ribu Goroutine boleh dibuat dengan mudah untuk mencapai pemprosesan serentak yang tinggi.

Berikut ialah contoh mudah yang menunjukkan cara mencipta dan menjalankan Goroutine:

package main

import (
    "fmt"
    "time"
)

func foo() {
    for i := 0; i < 5; i++ {
        fmt.Println("Goroutine:", i)
        time.Sleep(time.Millisecond * 500)
    }
}

func main() {
    go foo() // 创建并运行一个Goroutine
    for i := 0; i < 5; i++ {
        fmt.Println("Main:", i)
        time.Sleep(time.Millisecond * 500)
    }
}

Dalam contoh di atas, kami mencipta fungsi bernama foo dan menambahkannya dalam main() Dalam , Goroutine dicipta melalui kata kunci <code>go untuk melaksanakan fungsi foo() secara serentak. Seperti yang anda lihat, utas utama dan Goroutine berjalan pada masa yang sama, mengeluarkan setiap 500 milisaat. foo的函数,并在main()函数中通过go关键字创建了一个Goroutine来并发执行foo()函数。可以看到,主线程和Goroutine同时运行,每隔500毫秒输出一次。

二、Goroutine之间的通信
Goroutine之间可以通过channel进行通信。channel是一种用于同步和传递数据的类型。可以将其看作是一个队列,Goroutine可以通过channel发送和接收数据。

下面是一个简单的例子,展示如何使用channel进行Goroutine之间的通信:

package main

import (
    "fmt"
)

func send(c chan<- int) {
    for i := 0; i < 5; i++ {
        c <- i // 将数据发送到channel中
    }
    close(c) // 关闭channel
}

func receive(c <-chan int) {
    for num := range c { // 从channel中读取数据,直到channel被关闭
        fmt.Println("Received:", num)
    }
}

func main() {
    c := make(chan int) // 创建一个channel

    go send(c)    // 创建并运行发送Goroutine
    receive(c)    // 接收Goroutine

    fmt.Println("Main exits")
}

在上述例子中,我们创建了一个send函数和一个receive函数。send函数通过channel将0到4的整数发送给receive函数,而receive函数则从channel中读取数据并输出。在主函数中,我们创建了一个channel,并通过Goroutines来并发执行sendreceive函数。通过channel进行数据传输和同步。

三、Goroutine的同步与等待
在实际开发中,我们可能需要等待所有的Goroutines完成后再继续执行下一步操作。Golang提供了sync包来实现Goroutines的同步与等待。

下面是一个简单的例子,展示如何使用sync.WaitGroup来等待Goroutines完成:

package main

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

func foo(wg *sync.WaitGroup) {
    defer wg.Done() // 触发WaitGroup计数器减1
    for i := 0; i < 5; i++ {
        fmt.Println("Goroutine:", i)
        time.Sleep(time.Millisecond * 500)
    }
}

func main() {
    var wg sync.WaitGroup

    wg.Add(1)      // 增加WaitGroup计数器
    go foo(&wg)    // 创建并运行一个Goroutine

    wg.Wait()      // 等待所有Goroutines完成

    fmt.Println("Main exits")
}

在上述例子中,我们创建了一个WaitGroup实例,并在main()函数中增加了一个计数器。在foo()函数中,我们使用defer语句来触发计数器减1的操作。通过WaitGroupWait()方法来等待Goroutines的完成。这样可以确保所有的Goroutines执行完毕后,再继续执行后续的代码。

结论:
通过本文的介绍,我们了解了Golang中并发编程的基础知识。从Goroutines的创建和运行,到使用channel进行Goroutine之间的通信,再到利用sync.WaitGroup

2. Komunikasi antara Goroutines

Groutines boleh berkomunikasi melalui saluran. Saluran ialah jenis yang digunakan untuk menyegerakkan dan menghantar data. Ia boleh dianggap sebagai baris gilir, dan Goroutine boleh menghantar dan menerima data melalui saluran.

🎜Berikut ialah contoh mudah yang menunjukkan cara menggunakan saluran untuk komunikasi antara Goroutines: 🎜rrreee🎜Dalam contoh di atas, kami mencipta fungsi hantar dan Fungsi terima. Fungsi hantar menghantar integer dari 0 hingga 4 ke fungsi receive melalui saluran dan fungsi receive membaca data daripada saluran dan mengeluarkannya . Dalam fungsi utama, kami mencipta saluran dan melaksanakan fungsi hantar dan receive secara serentak melalui Goroutines. Penghantaran dan penyegerakan data dilakukan melalui saluran. 🎜🎜3. Penyegerakan dan menunggu Goroutine🎜Dalam pembangunan sebenar, kita mungkin perlu menunggu semua Goroutine selesai sebelum meneruskan ke langkah seterusnya. Golang menyediakan pakej sync untuk melaksanakan penyegerakan dan menunggu Goroutines. 🎜🎜Berikut ialah contoh mudah yang menunjukkan cara menggunakan sync.WaitGroup untuk menunggu Goroutines selesai: 🎜rrreee🎜Dalam contoh di atas, kami mencipta contoh WaitGroup dan A kaunter ditambahkan pada fungsi main(). Dalam fungsi foo(), kami menggunakan pernyataan tunda untuk mencetuskan operasi pengurangan pembilang sebanyak 1. Tunggu penyiapan Goroutines melalui kaedah Wait() WaitGroup. Ini memastikan bahawa semua Goroutines dilaksanakan sebelum meneruskan untuk melaksanakan kod berikutnya. 🎜🎜Kesimpulan: 🎜Melalui pengenalan artikel ini, kami telah mempelajari asas pengaturcaraan serentak di Golang. Daripada penciptaan dan menjalankan Goroutines, kepada penggunaan saluran untuk komunikasi antara Goroutines, kepada penggunaan sync.WaitGroup untuk mencapai penyegerakan dan menunggu Goroutines, kami boleh menggunakan ciri pengaturcaraan serentak Golang dengan lebih baik untuk menambah baik Prestasi dan kecekapan program. 🎜🎜Dengan mempelajari dan menguasai lagi pengaturcaraan serentak Golang, saya percaya ia akan membantu dalam membangunkan aplikasi Internet berkonkurensi tinggi. Marilah kita terus meneroka dalam amalan dan menerapkannya pada pembangunan sebenar untuk mencipta pengalaman aplikasi yang lebih baik untuk pengguna. 🎜

Atas ialah kandungan terperinci Tutorial Asas Pengaturcaraan Serentak Golang: Daripada Bermula dengan Goroutines kepada Aplikasi Praktikal. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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