Tutorial Lanjutan Pengaturcaraan Serentak Golang: Meneroka Mekanisme Dalaman Goroutines

WBOY
Lepaskan: 2023-07-18 20:16:49
asal
1147 orang telah melayarinya

Tutorial Lanjutan Pengaturcaraan Serentak Golang: Terokai Mekanisme Dalaman Goroutines

Pengenalan:
Golang ialah bahasa pengaturcaraan peringkat tinggi yang menyokong pengaturcaraan serentak. Di Golang, kami menggunakan Goroutines untuk melaksanakan operasi serentak. Goroutine ialah utas ringan yang boleh melakukan pelbagai tugas serentak dalam program. Artikel ini akan meneroka mekanisme dalaman Goroutines dan memahami cara ia melaksanakan operasi serentak.

1. Prinsip asas Goroutines
Prinsip asas Goroutines ialah merangkum panggilan fungsi ke dalam unit pelaksanaan bebas. Apabila kita memanggil fungsi menggunakan kata kunci go, Goroutines baharu dicipta dan fungsi itu dijalankan di dalamnya. Apabila fungsi dipanggil menggunakan kata kunci go, program kembali serta-merta dan terus melaksanakan baris kod seterusnya tanpa menunggu pelaksanaan fungsi selesai.

Berikut ialah contoh kod mudah:

package main

import (
    "fmt"
    "time"
)

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

func main() {
    go sayHello()
    for i := 0; i < 5; i++ {
        fmt.Println("World")
        time.Sleep(time.Millisecond * 500)
    }
    time.Sleep(time.Second)
}
Salin selepas log masuk

Dalam kod di atas, kami mentakrifkan fungsi sayHello untuk mencetak rentetan "Hello". Dalam fungsi utama, kami memanggil fungsi sayHello menggunakan kata kunci pergi, buat Goroutines baharu dan jalankannya di dalamnya. Pada masa yang sama, fungsi utama akan terus melaksanakan kod berikutnya.

Menjalankan kod di atas, kita dapat melihat bahawa "Hello" dan "World" dicetak secara berselang-seli, menunjukkan bahawa fungsi sayHello dan fungsi utama dilaksanakan secara serentak.

2. Penjadual Goroutines
Penjadual Goroutines ialah sebahagian daripada sistem masa jalan Golang dan bertanggungjawab untuk menguruskan pelaksanaan Goroutines secara serentak. Penjadual menentukan Goroutines yang harus dijalankan, dijeda dan menyambung semula pelaksanaan. Penjadual akan memperuntukkan kepingan masa kepada Goroutine yang berbeza mengikut beberapa strategi untuk mencapai pelaksanaan serentak.

Penjadual Golang mengguna pakai penjadualan awalan, iaitu, selepas Goroutines berjalan untuk satu tempoh masa, penjadual akan mengganggunya dan beralih kepada pelaksanaan Goroutines yang lain. Kaedah ini boleh memastikan bahawa setiap Goroutines boleh mendapat masa pelaksanaan tertentu, mengelakkan situasi di mana Goroutines tertentu mengambil CPU untuk masa yang lama dan menyebabkan Goroutines lain tidak dapat melaksanakan.

3. Prinsip konkurensi Goroutines
Konkurensi Goroutines dicapai melalui multi-threading. Dalam program Golang, penjadual akan mencipta berbilang rangkaian sistem pengendalian berdasarkan situasi sebenar sistem dan setiap rangkaian boleh menjalankan berbilang Goroutine pada masa yang sama. Apabila Goroutines menyekat, penjadual akan menjedanya dan bertukar kepada Goroutines boleh jalan lain untuk meneruskan pelaksanaan.

Jadual penjadual Golang antara rangkaian dan Goroutines, memastikan pelaksanaan Goroutines serentak. Melalui pelaksanaan serentak, program Golang boleh menggunakan sepenuhnya kuasa pengkomputeran pemproses berbilang teras untuk meningkatkan prestasi program dan kelajuan tindak balas.

4. Mekanisme komunikasi Goroutines
Untuk mencapai pengaturcaraan serentak, bukan sahaja keupayaan pelaksanaan serentak diperlukan, tetapi juga komunikasi antara Goroutine yang berbeza. Golang menyediakan mekanisme komunikasi yang ringan - Saluran.

Saluran ialah objek yang digunakan untuk menghantar data antara Goroutines. Melalui saluran, Goroutines boleh menghantar dan menerima data dengan selamat, mencapai penyegerakan dan perkongsian data.

Berikut ialah contoh kod untuk menggunakan saluran untuk pemindahan data:

package main

import (
    "fmt"
)

func sender(ch chan<- int) {
    for i := 0; i < 5; i++ {
        ch <- i
    }
    close(ch)
}

func receiver(ch <-chan int) {
    for val := range ch {
        fmt.Println(val)
    }
}

func main() {
    ch := make(chan int)
    go sender(ch)
    receiver(ch)
}
Salin selepas log masuk

Dalam kod di atas, kami mentakrifkan fungsi penghantar dan fungsi penerima. Melalui saluran ch, hantar data ke ch dalam fungsi penghantar, dan terima serta keluarkan data dalam fungsi penerima.

Menjalankan kod di atas, kita dapat melihat bahawa fungsi penghantar menghantar nombor 0 hingga 4 untuk menyalurkan ch dalam urutan, dan fungsi penerima menerima data daripada saluran ch dan mengeluarkannya.

Melalui penggunaan saluran, kami dapat merealisasikan pemindahan data dan penyegerakan antara Goroutine yang berbeza, meningkatkan kebolehselenggaraan dan kebolehskalaan program.

Ringkasan:
Artikel ini meneroka mekanisme dalaman Goroutines dan memperkenalkan prinsip asas, penjadual, prinsip konkurensi dan mekanisme komunikasi Goroutines. Menggunakan Goroutine dan saluran, kami boleh melaksanakan pengaturcaraan serentak dengan mudah dan meningkatkan prestasi program dan kelajuan tindak balas. Menguasai mekanisme dalaman Goroutines adalah sangat penting untuk menggunakan Golang secara berkesan untuk pengaturcaraan serentak.

(Nota: Kod contoh di atas hanya untuk ilustrasi, penggunaan sebenar mungkin memerlukan pengubahsuaian dan pelarasan yang sesuai mengikut keadaan tertentu)

Atas ialah kandungan terperinci Tutorial Lanjutan Pengaturcaraan Serentak Golang: Meneroka Mekanisme Dalaman Goroutines. 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