go語言阻塞函數(shù)和非阻塞函數(shù)實(shí)現(xiàn)
1、阻塞函數(shù)
阻塞函數(shù)在沒有得到結(jié)果之前,會(huì)將自己掛起,阻塞當(dāng)前線程,如下所示。
package main import ( ?? ?"fmt" ?? ?"time" ) func func1() error { ?? ?for { ?? ??? ?time.Sleep(time.Microsecond) ?? ??? ?//或者做其它的操作后,通過break跳出循環(huán) ?? ?} ?? ?return nil } func main() { ?? ?err := func1() ?? ?fmt.Println(err) ? //只有等func1中for循環(huán)結(jié)束才能打印err }
其中,func1就是阻塞函數(shù),因?yàn)閙ain函數(shù)在調(diào)用func1時(shí),它需要去等待func1函數(shù)for循環(huán)結(jié)束從而拿到返回值,在func1函數(shù)返回之前,main函數(shù)不能去做其它的事情。這里的main函數(shù)和func1函數(shù)都在同一個(gè)線程,所以func1函數(shù)會(huì)阻塞當(dāng)前線程。
2、非阻塞函數(shù)
非阻塞函數(shù)不會(huì)阻塞當(dāng)前線程。
package main import ( ?? ?"fmt" ?? ?"time" ) func func1() error { ?? ?go func() { ?? ??? ?for { ?? ??? ??? ?time.Sleep(time.Microsecond) ?? ??? ??? ?//或者做其它的操作后,通過break跳出循環(huán) ?? ??? ?} ?? ?}() ?? ?return nil } func main() { ?? ?err := func1() ?? ?fmt.Println(err) //立馬打印出了<nil> }
其中,func1就是非阻塞函數(shù),對(duì)于main函數(shù)而言,在調(diào)用func1后,不需要去關(guān)心func1中的for循環(huán)有沒有運(yùn)行結(jié)束,它能立馬拿到結(jié)果,從而可以去做自己想做的其它事情。當(dāng)然,這里main的函數(shù),即主線程需要保證當(dāng)前線程不會(huì)掛掉。
3、總結(jié)
從上面兩個(gè)例子可以看出來,非阻塞函數(shù)其實(shí)就是通過go語言中的協(xié)程來實(shí)現(xiàn)的。
到此這篇關(guān)于go語言阻塞函數(shù)和非阻塞函數(shù)實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)go語言阻塞函數(shù)和非阻塞函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang實(shí)現(xiàn)文件夾的創(chuàng)建與刪除的方法詳解
這篇文章主要介紹了如何利用Go語言實(shí)現(xiàn)對(duì)文件夾的常用操作:創(chuàng)建于刪除。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-05-05詳解Go?flag實(shí)現(xiàn)二級(jí)子命令的方法
這篇文章主要介紹了Go?flag?詳解,實(shí)現(xiàn)二級(jí)子命令,本文就探討一下?Go?語言中如何寫一個(gè)擁有類似特性的命令行程序,需要的朋友可以參考下2022-07-07詳解Go語言中的數(shù)據(jù)類型及類型轉(zhuǎn)換
這篇文章主要為大家介紹了Go語言中常見的幾種數(shù)據(jù)類型,以及他們之間的轉(zhuǎn)換方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-04-04