3 回答

TA貢獻1772條經(jīng)驗 獲得超6個贊
從第3天教程引述<-閱讀此內(nèi)容以獲取更多信息。
Goroutines根據(jù)需要多路復用到系統(tǒng)線程上。當goroutine執(zhí)行阻塞系統(tǒng)調(diào)用時,不會阻塞其他goroutine。
在某些時候,我們將對與CPU綁定的goroutine進行相同的操作,但是現(xiàn)在,如果要使用用戶級并行性,則必須設置$ GOMAXPROCS?;蛑码妑untime.GOMAXPROCS(n)。
goroutine不一定與OS線程相對應。它可以具有較小的初始堆棧大小,并且堆棧將根據(jù)需要增長。
需要時,可以將多個gorouitines復用到單個線程中。
更重要的是,該概念如上所述,goroutine是一個順序程序,可能會阻塞自身,但不會阻塞其他goroutine。
Goroutines在gccgo中作為pthreads實現(xiàn),因此它也可以與OS線程相同。它將OS線程的概念與我們在編程時對多線程的思想分開。

TA貢獻1825條經(jīng)驗 獲得超4個贊
在參考編譯器(5g / 6g / 8g)中,主調(diào)度程序(src / pkg / runtime / proc.c)創(chuàng)建N個OS線程,其中N由runtime.GOMAXPROCS(n)(默認值為1)控制。每個調(diào)度程序線程都會從主列表中拉出一個新的goroutine并開始運行它。goroutine將繼續(xù)運行,直到進行系統(tǒng)調(diào)用(例如printf)或在通道上進行操作為止,此時調(diào)度程序?qū)@取下一個goroutine并從其停止的那一點開始運行它(請參閱gosched()調(diào)用src / pkg / runtime / chan.c)。
出于所有目的和目的,調(diào)度是使用協(xié)程實現(xiàn)的??梢允褂胹etjmp()和longjmp()在C語言中編寫相同的功能,Go(以及其他實現(xiàn)輕量級/綠色線程的語言)只是為您實現(xiàn)了自動化。
輕量級線程的好處在于,因為它是所有用戶空間,因此創(chuàng)建“線程”非常便宜(分配小的默認堆棧),并且由于線程之間相互通信的固有結構而非常高效。缺點是它們不是真正的線程,這意味著單個輕量級線程可以阻止整個程序,即使看起來所有線程都應同時運行。
- 3 回答
- 0 關注
- 338 瀏覽
添加回答
舉報