Go中阻塞以及非阻塞操作實(shí)現(xiàn)(Goroutine和main Goroutine)
main函數(shù)本身也是一個(gè)Goroutine。
在Go語言中,main函數(shù)是程序的入口點(diǎn)。當(dāng)程序啟動(dòng)時(shí),Go運(yùn)行時(shí)會(huì)創(chuàng)建一個(gè)名為main的Goroutine,并在其中執(zhí)行main函數(shù)的代碼。這個(gè)main Goroutine 是程序中的主要執(zhí)行線程,它負(fù)責(zé)執(zhí)行main函數(shù)中的指令和操作。
與其他用戶創(chuàng)建的Goroutine類似,main Goroutine 也是并發(fā)執(zhí)行的。它可以與其他Goroutine同時(shí)執(zhí)行,利用多核處理器的并行性。
main Goroutine 的生命周期與程序的生命周期相同。當(dāng)main函數(shù)執(zhí)行完成或顯式調(diào)用os.Exit函數(shù)終止程序時(shí),main Goroutine 會(huì)隨之結(jié)束。其他正在執(zhí)行的Goroutine也會(huì)被終止,程序會(huì)退出。
因此,我們可以把main函數(shù)看作是程序中的一個(gè)特殊的Goroutine,它是程序的入口和控制中心。通過在main函數(shù)內(nèi)部啟動(dòng)其他Goroutine,我們可以實(shí)現(xiàn)多個(gè)任務(wù)的并發(fā)執(zhí)行,充分利用Go語言的并發(fā)能力。
Go語言中,阻塞和非阻塞是用來描述對(duì)某個(gè)操作的等待行為的。
阻塞(Blocking):當(dāng)執(zhí)行一個(gè)操作時(shí),如果該操作無法立即完成,程序會(huì)被阻塞,即暫停執(zhí)行,直到該操作完成或滿足某個(gè)條件。在阻塞狀態(tài)下,程序無法繼續(xù)執(zhí)行其他任務(wù),直到阻塞的操作完成。例如,當(dāng)我們讀取一個(gè)通道(channel)時(shí),如果通道中沒有可讀取的數(shù)據(jù),讀取操作將會(huì)阻塞,直到有數(shù)據(jù)可讀。
package main import ( "fmt" "time" ) func main() { ch := make(chan int) // 創(chuàng)建一個(gè)通道 go func() { time.Sleep(2 * time.Second) ch <- 42 // 向通道發(fā)送數(shù)據(jù) }() fmt.Println("Waiting for data...") data := <-ch // 從通道接收數(shù)據(jù),如果通道中沒有數(shù)據(jù),該行會(huì)阻塞等待 fmt.Println("Received data:", data) }
在上述示例中,我們創(chuàng)建了一個(gè)通道ch
,并在一個(gè)Goroutine中等待2秒后向通道發(fā)送了數(shù)據(jù)(你可以嘗試修改time.Sleep函數(shù)后的數(shù)字,分別運(yùn)行來看效果)。在主Goroutine中,我們嘗試從通道ch
中接收數(shù)據(jù)。由于通道中沒有數(shù)據(jù)可用,接收操作會(huì)被阻塞,直到數(shù)據(jù)發(fā)送到通道為止。
非阻塞(Non-blocking):當(dāng)執(zhí)行一個(gè)操作時(shí),如果該操作無法立即完成,程序不會(huì)被阻塞,而是立即返回,不管操作是否成功或者完成。通過使用非阻塞操作,程序可以繼續(xù)執(zhí)行其他任務(wù),而不需要等待阻塞的操作完成。例如,使用非阻塞的方式讀取通道時(shí),如果通道中沒有數(shù)據(jù)可讀,讀取操作會(huì)立即返回一個(gè)錯(cuò)誤或默認(rèn)值。
package main import ( "fmt" "time" ) func main() { ch := make(chan int) // 創(chuàng)建一個(gè)通道 go func() { time.Sleep(2 * time.Second) ch <- 42 // 向通道發(fā)送數(shù)據(jù) }() fmt.Println("Waiting for data...") select { case data := <-ch: // 嘗試從通道接收數(shù)據(jù) fmt.Println("Received data:", data) default: fmt.Println("No data available") } }
在上述示例中,我們使用select
語句來嘗試從通道ch
中接收數(shù)據(jù)。如果通道中沒有可用的數(shù)據(jù),select
語句會(huì)立即執(zhí)行default
分支,輸出"No data available",而不會(huì)阻塞等待。這樣,程序可以繼續(xù)執(zhí)行其他任務(wù),而不需要等待數(shù)據(jù)的到達(dá)。
阻塞和非阻塞是用來描述對(duì)于某個(gè)操作的等待行為的概念。阻塞表示當(dāng)一個(gè)操作無法立即完成時(shí),程序會(huì)暫停執(zhí)行,直到操作完成。非阻塞表示當(dāng)一個(gè)操作無法立即完成時(shí),程序會(huì)立即返回,繼續(xù)執(zhí)行其他任務(wù)。在Go語言中,通常使用通道操作來展示阻塞和非阻塞的概念。
到此這篇關(guān)于Go中阻塞以及非阻塞操作實(shí)現(xiàn)(Goroutine和main Goroutine)的文章就介紹到這了,更多相關(guān)Go 阻塞 非阻塞內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang 實(shí)現(xiàn)json類型不確定時(shí)的轉(zhuǎn)換
這篇文章主要介紹了golang 實(shí)現(xiàn)json類型不確定時(shí)的轉(zhuǎn)換操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01使用Go語言進(jìn)行安卓開發(fā)的詳細(xì)教程
本文將介紹如何使用Go語言進(jìn)行安卓開發(fā),我們將探討使用Go語言進(jìn)行安卓開發(fā)的優(yōu)點(diǎn)、準(zhǔn)備工作、基本概念和示例代碼,通過本文的學(xué)習(xí),你將了解如何使用Go語言構(gòu)建高效的安卓應(yīng)用程序,需要的朋友可以參考下2023-11-11

利用golang和shell計(jì)算一個(gè)字符串的md5值

go語言如何使用gin庫(kù)實(shí)現(xiàn)SSE長(zhǎng)連接