Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Analisis mendalam ciri bahasa Golang: pengaturcaraan berbilang benang dan penjadualan tugas

Analisis mendalam ciri bahasa Golang: pengaturcaraan berbilang benang dan penjadualan tugas

王林
王林asal
2023-07-18 14:33:241560semak imbas

Analisis mendalam tentang ciri bahasa Golang: pengaturcaraan berbilang benang dan penjadualan tugas

Pengenalan:
Golang (juga dikenali sebagai bahasa Go), sebagai bahasa yang ditaip kuat secara statik, secara beransur-ansur disukai oleh pembangun kerana prestasi cemerlang dan sintaksnya yang ringkas . Salah satu matlamat reka bentuknya adalah untuk menyokong pengaturcaraan berbilang benang Melalui ciri Goroutine dan Saluran, pembangun boleh melaksanakan pengaturcaraan berbilang benang dengan mudah. Artikel ini akan meneroka secara mendalam ciri pengaturcaraan berbilang benang Golang, memfokuskan pada hubungan antara penjadualan tugas dan coroutine.

Pengaturcaraan dan coroutine berbilang benang:
Di Golang, unit konkurensi yang paling asas ialah coroutine (Goroutine), yang boleh difahami sebagai benang ringan. Berbanding dengan utas tradisional, overhed penciptaan dan pemusnahan coroutine adalah sangat kecil, dan penukaran konteks boleh dilakukan dengan cekap, oleh itu, di Golang, kami boleh mencipta sejumlah besar coroutine untuk melaksanakan tugas secara serentak tanpa perlu risau tentang isu prestasi.

Berikut ialah contoh kod ringkas yang menunjukkan cara membuat dan memulakan coroutine:

package main

import (
    "fmt"
    "time"
)

func main() {
    go hello()
    time.Sleep(1 * time.Second)
    fmt.Println("main goroutine exit")
}

func hello() {
    fmt.Println("Hello, Golang!")
}

Dalam contoh di atas, kami mencipta coroutine melalui kata kunci go dan lulus utama fungsi kod> memulakan coroutine ini. Dalam fungsi main, kami menunggu selama 1 saat melalui fungsi time.Sleep untuk memastikan coroutine dapat berjalan dengan normal. Akhir sekali, kami mengeluarkan mesej dan menunggu penghujung coroutine sebelum fungsi main tamat. Menjalankan program, anda boleh mendapatkan output berikut: go关键字创建了一个协程,并通过main函数启动了这个协程。在main函数中,我们通过time.Sleep函数等待1秒,以确保协程能够正常运行。最后,我们输出一条消息,并在main函数结束前等待协程的结束。运行该程序,可以得到以下输出:

Hello, Golang!
main goroutine exit

可以看到,协程的创建和启动非常简单,只需使用go

package main

import (
    "fmt"
    "time"
)

func main() {
    for i := 0; i < 5; i++ {
        go worker(i)
    }

    time.Sleep(3 * time.Second)
    fmt.Println("main goroutine exit")
}

func worker(id int) {
    fmt.Printf("Worker %d started
", id)
    time.Sleep(1 * time.Second)
    fmt.Printf("Worker %d finished
", id)
}

Seperti yang anda lihat, penciptaan dan permulaan coroutine adalah sangat mudah, hanya gunakan kata kunci go. Kod dalam coroutine akan berjalan secara tidak segerak dan tidak akan menyekat pelaksanaan utas utama.


Hubungan antara penjadualan tugas dan coroutine:

Penjadual Golang (Penjadual) bertanggungjawab untuk menyelaraskan pelaksanaan antara coroutine. Penjadual memperuntukkan coroutine kepada utas sistem (Thread) untuk melaksanakan penjadualan dan pelaksanaan coroutine pada thread fizikal. Penjadual Golang ialah sebahagian daripada sistem masa jalan (Runtime) Ia bertanggungjawab untuk menjadualkan pelaksanaan tugas semasa pelaksanaan coroutine, dan melaksanakan tugas seperti pengurusan keutamaan, penukaran konteks dan menyekat/bangun.

Di Golang, penjadual menggunakan strategi pengurusan benang yang dipanggil model GMP. G bermaksud Global, P bermaksud benang Fizikal, dan M bermaksud Mesin. Idea teras model GMP adalah untuk mengikat coroutine (Goroutine) ke benang fizikal (Thread), dan secara dinamik memperuntukkan tugas pelaksanaan coroutine pada thread yang berbeza melalui penjadual (Scheduler).

Penjadual Golang menggunakan strategi penjadualan awalan, iaitu, apabila coroutine mengambil masa terlalu lama untuk dilaksanakan atau disekat, penjadual akan secara aktif menjadualkan pelaksanaan coroutine lain untuk meningkatkan prestasi serentak program. Penjadual juga akan melaraskan susunan pelaksanaan tugas secara dinamik berdasarkan keutamaan dan jenis tugas coroutine untuk memastikan prestasi keseluruhan program.

Berikut ialah kod sampel yang menunjukkan perhubungan penjadualan antara berbilang coroutine:

Worker 0 started
Worker 1 started
Worker 2 started
Worker 3 started
Worker 4 started
Worker 4 finished
Worker 0 finished
Worker 1 finished
Worker 2 finished
Worker 3 finished
main goroutine exit

Dalam contoh di atas, kami mencipta 5 coroutine untuk melaksanakan tugas secara serentak. Setiap coroutine akan mengeluarkan IDnya sendiri dan simulasi tidur akan dilakukan sebelum dan selepas pelaksanaan tugas. Kami menunggu 3 saat dalam urutan utama untuk memastikan semua coroutine boleh dilaksanakan. Menjalankan program ini, anda boleh mendapatkan output berikut:

rrreee

Anda dapat melihat bahawa susunan pelaksanaan antara berbilang coroutine tidak pasti, dan susunan output mungkin berbeza setiap kali ia dijalankan. Ini kerana penjadual secara dinamik menjadualkan pelaksanaan coroutine pada urutan yang berbeza untuk meningkatkan prestasi serentak. Selain itu, susunan pelaksanaan coroutine juga dipengaruhi oleh faktor seperti sistem pengendalian dan persekitaran perkakasan.


Kesimpulan:

Melalui analisis mendalam tentang ciri pengaturcaraan berbilang benang dan penjadualan tugas Golang, kita dapati Golang menyediakan model pengaturcaraan serentak yang mudah dan cekap. Melalui ciri coroutine dan saluran, kami boleh melaksanakan peruntukan dan penjadualan tugas serentak dengan mudah dan memberikan permainan sepenuhnya kepada kelebihan prestasi pemproses berbilang teras. Dalam projek sebenar, kami boleh menggunakan coroutine dan saluran secara fleksibel mengikut tugas dan keperluan khusus untuk mencapai pengaturcaraan serentak berkualiti tinggi.

Rujukan:
  1. https://golang.org/
  2. https://tour.golang.org/concurrency/1
🎜

Atas ialah kandungan terperinci Analisis mendalam ciri bahasa Golang: pengaturcaraan berbilang benang dan penjadualan tugas. 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