Di Golang, kami boleh mencipta utas serentak melalui goroutine, dan kitaran hayat utas ini biasanya diuruskan oleh sistem masa jalan Golang. Walau bagaimanapun, dalam beberapa kes, kita mungkin perlu mengawal kitaran hayat benang, seperti menghentikan benang yang sedang berjalan selepas syarat tertentu dipenuhi. Artikel ini akan memperkenalkan cara menghentikan benang di Golang.
Di Golang, saluran ialah alat yang sangat berkuasa yang boleh digunakan untuk komunikasi dan penyegerakan antara rangkaian. Dan saluran di Golang adalah selamat untuk rangkaian, jadi kami boleh menggunakan saluran untuk menghentikan rangkaian.
Pertama, kami mentakrifkan saluran berhenti:
stopCh := make(chan struct{})
Kemudian, dalam urutan kami, kami boleh menghantar isyarat kepada saluran apabila syarat tertentu dipenuhi, menunjukkan bahawa ia perlu berhenti Urutan semasa:
select { case <- stopCh: // 收到停止信号,退出线程 return default: // 正常运行代码 }
Akhir sekali, kami hanya perlu menghantar isyarat ke saluran ini di mana utas perlu dihentikan untuk menghentikan utas:
close(stopCh)
Dalam versi selepas Golang 1.7, pakej konteks ditambahkan pada pustaka standard, yang menyediakan kaedah yang lebih fleksibel untuk mengawal kitaran hayat benang.
Kami mula-mula mencipta konteks:
ctx, cancel := context.WithCancel(context.Background())
Kemudian, dalam urutan kami, kami boleh mendengar konteks ini dan keluar dari rangkaian jika isyarat berhenti diterima:
for { select { case <- ctx.Done(): // 收到停止信号,退出线程 return default: // 正常运行代码 } }
Akhir sekali, kita hanya perlu memanggil fungsi batal di mana utas perlu dihentikan untuk menghentikan utas:
cancel()
Kecuali Menggunakan saluran dan konteks, pakej penyegerakan dalam pustaka standard Golang juga menyediakan cara untuk mengawal kitaran hayat benang. Kita boleh menggunakan WaitGroup dalam pakej penyegerakan untuk menyelaraskan perjalanan benang.
Mula-mula, kami mencipta WaitGroup:
var wg sync.WaitGroup
Kemudian, dalam urutan kami, kami memulakan coroutine dan melaksanakan kod, dan mengawal kitaran hayatnya melalui kaunter WaitGroup:
wg.Add(1) go func() { for { select { case <- stopCh: // 停止信号,清除WaitGroup计数器 wg.Done() return default: // 正常运行代码 } } }()
Akhir sekali, kita hanya perlu menunggu semua coroutine keluar di mana kita perlu menghentikan benang:
close(stopCh) wg.Wait()
Ringkasan:
Di atas adalah di Golang Tiga cara untuk menghentikan benang. Dalam senario yang berbeza, kita boleh memilih cara yang berbeza untuk menghentikan benang mengikut keperluan. Kaedah saluran adalah ringkas dan mudah digunakan, kaedah konteks lebih fleksibel, dan kaedah penyegerakan.WaitGroup boleh mengawal kitaran hayat berbilang coroutine. Dalam penggunaan sebenar, kita perlu membuat pilihan berdasarkan senario aplikasi tertentu.
Atas ialah kandungan terperinci Bagaimana untuk menghentikan benang di Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!