mirror of
https://github.com/gopl-zh/gopl-zh.github.com.git
synced 2025-08-06 07:32:07 +00:00
回到简体
This commit is contained in:
@@ -1,17 +1,17 @@
|
||||
## 8.1. Goroutines
|
||||
|
||||
在Go語言中,每一個併發的執行單元叫作一個goroutine。設想這里的一個程序有兩個函數,一個函數做計算,另一個輸出結果,假設兩個函數沒有相互之間的調用關繫。一個線性的程序會先調用其中的一個函數,然後再調用另一個。如果程序中包含多個goroutine,對兩個函數的調用則可能發生在同一時刻。馬上就會看到這樣的一個程序。
|
||||
在Go语言中,每一个并发的执行单元叫作一个goroutine。设想这里的一个程序有两个函数,一个函数做计算,另一个输出结果,假设两个函数没有相互之间的调用关系。一个线性的程序会先调用其中的一个函数,然后再调用另一个。如果程序中包含多个goroutine,对两个函数的调用则可能发生在同一时刻。马上就会看到这样的一个程序。
|
||||
|
||||
如果你使用過操作繫統或者其它語言提供的線程,那麽你可以簡單地把goroutine類比作一個線程,這樣你就可以寫出一些正確的程序了。goroutine和線程的本質區别會在9.8節中講。
|
||||
如果你使用过操作系统或者其它语言提供的线程,那么你可以简单地把goroutine类比作一个线程,这样你就可以写出一些正确的程序了。goroutine和线程的本质区别会在9.8节中讲。
|
||||
|
||||
當一個程序啟動時,其主函數卽在一個單獨的goroutine中運行,我們叫它main goroutine。新的goroutine會用go語句來創建。在語法上,go語句是一個普通的函數或方法調用前加上關鍵字go。go語句會使其語句中的函數在一個新創建的goroutine中運行。而go語句本身會迅速地完成。
|
||||
当一个程序启动时,其主函数即在一个单独的goroutine中运行,我们叫它main goroutine。新的goroutine会用go语句来创建。在语法上,go语句是一个普通的函数或方法调用前加上关键字go。go语句会使其语句中的函数在一个新创建的goroutine中运行。而go语句本身会迅速地完成。
|
||||
|
||||
```go
|
||||
f() // call f(); wait for it to return
|
||||
go f() // create a new goroutine that calls f(); don't wait
|
||||
```
|
||||
|
||||
下面的例子,main goroutine將計算菲波那契數列的第45個元素值。由於計算函數使用低效的遞歸,所以會運行相當長時間,在此期間我們想讓用戶看到一個可見的標識來表明程序依然在正常運行,所以來做一個動畵的小圖標:
|
||||
下面的例子,main goroutine将计算菲波那契数列的第45个元素值。由于计算函数使用低效的递归,所以会运行相当长时间,在此期间我们想让用户看到一个可见的标识来表明程序依然在正常运行,所以来做一个动画的小图标:
|
||||
|
||||
<u><i>gopl.io/ch8/spinner</i><u>
|
||||
```go
|
||||
@@ -39,12 +39,12 @@ func fib(x int) int {
|
||||
}
|
||||
```
|
||||
|
||||
動畵顯示了幾秒之後,fib(45)的調用成功地返迴,併且打印結果:
|
||||
动画显示了几秒之后,fib(45)的调用成功地返回,并且打印结果:
|
||||
|
||||
```
|
||||
Fibonacci(45) = 1134903170
|
||||
```
|
||||
|
||||
然後主函數返迴。主函數返迴時,所有的goroutine都會被直接打斷,程序退出。除了從主函數退出或者直接終止程序之外,沒有其它的編程方法能夠讓一個goroutine來打斷另一個的執行,但是之後可以看到一種方式來實現這個目的,通過goroutine之間的通信來讓一個goroutine請求其它的goroutine,併被請求的goroutine自行結束執行。
|
||||
然后主函数返回。主函数返回时,所有的goroutine都会被直接打断,程序退出。除了从主函数退出或者直接终止程序之外,没有其它的编程方法能够让一个goroutine来打断另一个的执行,但是之后可以看到一种方式来实现这个目的,通过goroutine之间的通信来让一个goroutine请求其它的goroutine,并被请求的goroutine自行结束执行。
|
||||
|
||||
留意一下這里的兩個獨立的單元是如何進行組合的,spinning和菲波那契的計算。分别在獨立的函數中,但兩個函數會同時執行。
|
||||
留意一下这里的两个独立的单元是如何进行组合的,spinning和菲波那契的计算。分别在独立的函数中,但两个函数会同时执行。
|
||||
|
Reference in New Issue
Block a user