Dalam bahasa Go, Goroutine dan Thread ialah kedua-dua mekanisme yang digunakan untuk menjalankan kod serentak. Walaupun fungsi mereka serupa, terdapat beberapa perbezaan dalam pelaksanaan dan penggunaannya. Artikel ini akan meneroka perbezaan antara coroutine dan urutan dalam bahasa Go melalui contoh kod tertentu dan membantu pembaca memahami dengan lebih baik perbezaan antara mereka.
1. Konsep coroutine dan thread
Coroutine ialah unit concurrency ringan dalam bahasa Go dan boleh dianggap sebagai thread ringan. Coroutine diuruskan oleh masa jalan Go dan mempunyai ruang tindanan yang kecil dan overhed penciptaan dan pemusnahan yang rendah, membolehkan sejumlah besar coroutine dibuat untuk pelaksanaan serentak tanpa perlu risau tentang pembaziran sumber.
Thread ialah unit pelaksanaan serentak di peringkat sistem pengendalian dan diuruskan oleh kernel sistem pengendalian. Setiap utas mempunyai ruang tindanan dan daftar tersendiri Penciptaan dan pemusnahan utas adalah mahal, jadi mustahil untuk mencipta sejumlah besar utas pelaksanaan serentak seperti coroutine.
2. Contoh penggunaan coroutine
Berikut ialah contoh kod mudah penggunaan coroutine:
package main import ( "fmt" "time" ) func printNumbers() { for i := 1; i <= 5; i++ { fmt.Println(i) } } func main() { go printNumbers() time.Sleep(1 * time.Second) fmt.Println("Main goroutine exits") }
Dalam kod di atas, fungsi printNumbers
dimulakan sebagai coroutine, Fungsi ini akan cetak nombor 1 hingga 5. Dalam fungsi utama, gunakan kata kunci go
untuk memulakan coroutine printNumbers
dan biarkan fungsi utama menunggu selama 1 saat melalui time.Sleep
Pastikan coroutine mempunyai masa yang mencukupi untuk dilaksanakan. Akhirnya, fungsi utama mengeluarkan "Keluar goroutine utama". printNumbers
函数被启动为一个协程,该函数会打印1到5这几个数字。在主函数中,使用go
关键字启动了printNumbers
协程,并且通过time.Sleep
函数让主函数等待1秒,以确保协程有足够的时间执行。最后主函数输出"Main goroutine exits"。
3. 使用线程的示例
下面是一个简单的使用线程的示例代码:
package main import ( "fmt" "sync" ) var wg sync.WaitGroup func printNumbers() { defer wg.Done() for i := 1; i <= 5; i++ { fmt.Println(i) } } func main() { wg.Add(1) go printNumbers() wg.Wait() fmt.Println("Main thread exits") }
在上面的代码中,printNumbers
函数被启动为一个线程,使用sync.WaitGroup
来等待线程的结束。在主函数中,通过wg.Add
来添加一个等待的线程,然后通过go
关键字启动printNumbers
线程。最后通过wg.Wait
函数等待线程结束,并输出"Main thread exits"。
4. 区别与总结
从以上的示例可以看出,使用协程需要通过go
关键字来启动,并且不需要显式等待协程结束;而使用线程则需使用一些同步机制(比如sync.WaitGroup
3 Contoh penggunaan benang
🎜🎜Berikut ialah contoh kod mudah menggunakan benang: 🎜rrreee🎜Dalam kod di atas, fungsiprintNumbers
dimulakan sebagai thread, menggunakan sync.WaitGroup
untuk menunggu penghujung urutan. Dalam fungsi utama, tambahkan urutan menunggu melalui wg.Add
, dan kemudian mulakan urutan printNumbers
melalui kata kunci go
. Akhir sekali, tunggu sehingga urutan berakhir melalui fungsi wg.Wait
dan keluarkan "Keluar utas utama". 🎜🎜🎜4 Perbezaan dan ringkasan🎜🎜🎜Seperti yang dapat dilihat daripada contoh di atas, penggunaan coroutine perlu dimulakan melalui kata kunci go
, dan tidak perlu menunggu coroutine secara eksplisit untuk tamat; semasa menggunakan utas Anda perlu menggunakan beberapa mekanisme penyegerakan (seperti sync.WaitGroup
) untuk menunggu urutan tamat. Di samping itu, penciptaan dan pemusnahan overhed coroutine adalah lebih kecil dan sejumlah besar coroutine serentak boleh dibuat manakala penciptaan dan pemusnahan overhed bagi thread adalah lebih besar dan tidak boleh dibuat secara besar-besaran. 🎜🎜Ringkasnya, terdapat beberapa perbezaan dalam pelaksanaan dan penggunaan coroutine dan rangkaian dalam bahasa Go Pembangun boleh memilih mekanisme konkurensi yang sesuai untuk melaksanakan pengaturcaraan serentak berdasarkan keperluan sebenar. Untuk senario yang memerlukan keselarasan berskala besar, anda disyorkan untuk menggunakan coroutine untuk senario yang memerlukan kurang keselarasan dan mempunyai keperluan yang lebih tinggi untuk sumber asas, anda boleh mempertimbangkan untuk menggunakan urutan. 🎜Atas ialah kandungan terperinci Perbandingan coroutine dan urutan dalam bahasa Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!