Bahasa Go ialah bahasa pengaturcaraan sumber terbuka Salah satu ciri uniknya ialah ia menyokong coroutine Model concurrency CSP menjadikannya sangat mudah untuk menggunakan coroutine dalam Go. Sebaliknya, benang ialah cara pengaturcaraan serentak yang lebih tradisional. Dalam artikel ini, kami akan meneroka perbezaan antara coroutine dan urutan bahasa Go dan menggambarkannya dengan contoh kod khusus.
Dalam pengaturcaraan, coroutine ialah strategi konkurensi yang lebih ringan daripada thread. Dalam bahasa Go, anda boleh membuat coroutine dengan mudah melalui kata kunci go
, sebagai contoh:
func main() { go func() { // 协程内容 }() // 主线程内容 }
Urutan ialah unit terkecil penjadualan sistem pengendalian dan membuat urutan menggunakan lebih banyak sumber sistem. Dalam pengaturcaraan berbilang benang tradisional, perpustakaan benang biasanya digunakan untuk mencipta dan mengurus benang.
Penjadual bahasa Go melaksanakan penjadualan coroutine dengan memperuntukkan baris gilir kerja kepada setiap pemproses logik Apabila coroutine menyekat, penjadual akan Mengalih keluarnya daripada pemproses logik untuk mengelakkan pembaziran sumber. Kaedah penjadualan ini menjadikan coroutine bahasa Go lebih cekap.
Sebaliknya, penjadualan benang dilakukan oleh sistem pengendalian. Dalam pengaturcaraan berbilang benang tradisional, penukaran konteks benang ditentukan oleh sistem pengendalian, yang mungkin memperkenalkan overhed tambahan.
Memandangkan penjadualan coroutine diurus oleh sistem masa jalan bahasa Go, overhed permulaan dan pemusnahan coroutine adalah sangat kecil, dan bertukar antara coroutine juga lebih mudah . Sebagai perbandingan, penciptaan dan pemusnahan benang agak mahal, dan menukar antara benang juga memerlukan lebih banyak sumber sistem.
Di bawah ini kami menggunakan contoh mudah untuk membandingkan perbezaan prestasi antara coroutine dan thread:
package main import ( "fmt" "time" ) func main() { start := time.Now() for i := 0; i < 1000; i++ { go func() { time.Sleep(1 * time.Second) }() } fmt.Println("协程耗时:", time.Since(start)) start = time.Now() for i := 0; i < 1000; i++ { go func() { time.Sleep(1 * time.Second) }() } fmt.Println("线程耗时:", time.Since(start)) }
Melalui contoh kod di atas, kita dapat melihat bahawa menggunakan coroutines mengambil masa yang jauh lebih singkat untuk memulakan seribu tugas daripada menggunakan cara thread. Ini menunjukkan bahawa coroutine bahasa Go mempunyai kelebihan yang jelas dalam prestasi. Ringkasan prestasinya lebih tinggi;
Atas ialah kandungan terperinci Perbincangan perbandingan coroutine dan utas bahasa Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!