Rumah > Artikel > pembangunan bahagian belakang > Analisis mendalam ciri bahasa Golang: pengaturcaraan berbilang benang dan penjadualan tugas
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:
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 exitDalam 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:
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!