make loop

This commit is contained in:
chai2010
2016-01-09 16:04:37 +08:00
parent 8a2cef3353
commit 2114343aeb
2 changed files with 8 additions and 8 deletions

View File

@@ -1,8 +1,8 @@
### 9.8.3. GOMAXPROCS
Go的度器使用了一叫做GOMAXPROCS的变量来决定会有多少操作系统的线程同时执行Go的代。其默的值是运行机器上的CPU的核心,所以在一有8核心的器上时,调度器一次在8OS线程上去度GO代。(GOMAXPROCS是前面的m:n度中的n)。在休眠中的或者在通信中被阻塞的goroutine是不需要一个对应的线程来做调度的。在I/O中或系统调用中或用非Go言函数时,是需要一个对应的操作系统线程的但是GOMAXPROCS不需要将这几种情况计数在内
Go的調度器使用了一叫做GOMAXPROCS的變量來決定會有多少操作繫統的線程同時執行Go的代。其默的值是運行機器上的CPU的核心,所以在一有8核心的器上時,調度器一次在8OS程上去調度GO代。(GOMAXPROCS是前面的m:n調度中的n)。在休眠中的或者在通信中被阻塞的goroutine是不需要一個對應的線程來做調度的。在I/O中或繫統調用中或調用非Go言函數時,是需要一個對應的操作繫統線程的但是GOMAXPROCS不需要將這幾種情況計數在內
你可以用GOMAXPROCS的环境变量吕显式地控制这个参数,或者也可以在运行时用runtime.GOMAXPROCS函数来修改它。我在下面的小程序中看到GOMAXPROCS的效果这个程序会无限打印0和1。
你可以用GOMAXPROCS的環境變量呂顯式地控製這個參數,或者也可以在運行時用runtime.GOMAXPROCS函數來脩改它。我在下面的小程序中看到GOMAXPROCS的效果這個程序會無限打印0和1。
```go
@@ -18,6 +18,6 @@ $ GOMAXPROCS=2 go run hacker-cliché.go
010101010101010101011001100101011010010100110...
```
在第一次执行时,最多同时只能有一goroutine被行。初始情况下只有main goroutine被行,所以打印很多1。了一段时间后GO度器会将其置休眠,并唤醒另一goroutine这时候就始打印很多0了在打印的goroutine是被度到操作系统线程上的。在第二次执行时,我使用了两个操作系统线程,所以两个goroutine可以一起被行,以同样的频率交替打印0和1。我们必须强调的是goroutine的度是受很多因子影而runtime也是在不断地发展演的,所以里的你实际得到的果可能会因为版本的不同而与我们运行的果有所不同。
在第一次執行時,最多同時隻能有一goroutine被行。初始情況下隻有main goroutine被行,所以打印很多1。了一段時間後GO調度器會將其置休眠,併喚醒另一goroutine這時候就始打印很多0了在打印的goroutine是被調度到操作繫統線程上的。在第二次執行時,我使用了兩個操作繫統線程,所以兩個goroutine可以一起被行,以同樣的頻率交替打印0和1。我們必鬚強調的是goroutine的調度是受很多因子影而runtime也是在不斷地發展演的,所以里的你實際得到的果可能會因爲版本的不同而與我們運行的果有所不同。
练习9.6: 测试一下算密集型的并发程序(练习8.5那的)被GOMAXPROCS怎样影响到。在你的电脑上最佳的值是多少?你的电脑CPU有多少核心?
練習9.6: 測試一下算密集型的併發程序(練習8.5那的)被GOMAXPROCS怎樣影響到。在你的電腦上最佳的值是多少?你的電腦CPU有多少核心?

View File

@@ -1,10 +1,10 @@
### 9.8.4. Goroutine沒有ID號
在大多支持多线程的操作系统和程序言中,前的线程都有一个独特的身份(id)并且这个身份信息可以以一普通值的形式被被很容易地取到,典型的可以是一integer或者指值。这种情况下我做一抽象化的thread-local storage(线程本地存,多线程编程中不希望其它线程访问的内容)就很容易,需要以线程的id作key的一map就可以解决问题,每一个线程以其id就能从中获取到值,且和其它线程互不突。
在大多支持多程的操作繫統和程序言中,前的程都有一個獨特的身份(id)併且這個身份信息可以以一普通值的形式被被很容易地取到,典型的可以是一integer或者指值。這種情況下我做一抽象化的thread-local storage(程本地存,多線程編程中不希望其它線程訪問的內容)就很容易,需要以程的id作key的一map就可以解決問題,每一個線程以其id就能從中獲取到值,且和其它程互不突。
goroutine有可以被程序员获取到的身份(id)的概念。这一点是设计上故意而之,由thread-local storage总是会被滥用。比如,一web server是用一支持tls的语言实现的,而非常普遍的是很多函数会去寻找HTTP求的信息,代表它就是去其存储层(这个存储层有可能是tls)找的。就像是那些分依全局量的程序一样,会导致一非健康的“距外行”,在这种行为下,一个函数的行可能不是由其自己部的量所定,而是由其所行在的线程所定。因此,如果线程本身的身份会改变--比如一些worker线程之的--那么函数的行为就会变得神秘莫测
goroutine有可以被程序員獲取到的身份(id)的概念。這一點是設計上故意而之,由thread-local storage總是會被濫用。比如,一web server是用一支持tls的語言實現的,而非常普遍的是很多函數會去尋找HTTP求的信息,代表它就是去其存儲層(這個存儲層有可能是tls)找的。就像是那些分依全局量的程序一樣,會導致一非健康的“距外行”,在這種行爲下,一個函數的行可能不是由其自己部的量所定,而是由其所行在的程所定。因此,如果程本身的身份會改變--比如一些worker程之的--那麽函數的行爲就會變得神祕莫測
Go鼓励更为简单的模式,这种模式下参数对函数的影都是式的。这样不仅使程序得更易,而且会让我们自由地向一些定的函分配子任务时不用心其身份信息影响行为
Go鼓勵更爲簡單的模式,這種模式下參數對函數的影都是式的。這樣不僅使程序得更易,而且會讓我們自由地向一些定的函分配子任務時不用心其身份信息影響行爲
现在应该已经明白了写一个Go程序所需要的所有言特性信息。在后面两章节中,我们会回顾一些之前的例和工具,支持我们写出更大模的程序:如何将一个工程组织成一列的包,如果取,建,测试,性能测试,剖析,写文档,并且将这些包分享出去。
現在應該已經明白了寫一個Go程序所需要的所有言特性信息。在後面兩章節中,我們會迴顧一些之前的例和工具,支持我們寫出更大模的程序:如何將一個工程組織成一列的包,如果取,建,測試,性能測試,剖析,寫文檔,併且將這些包分享出去。