golang 中使用 go 命令可以建立併發任務,理論上是可以開啟無窮個,但限於計算機資源有限,並不可以無窮。
注:在虛擬機器中進行。配置 1核心 128m記憶體。
例:
package main
import
("fmt"
"sync"
"time"
)func
main()
(i)}
wg.wait()
}輸出:
goroutine 305745
[semacquire]
:internal/poll.
runtime_semacquire
(0xc0000440cc
)/usr/lib/go-
1.14
/src/runtime/sema.go:
61+0x42
internal/poll.
(*fdmutex)
.rwlock
(0xc0000440c0
,0x7600000000
,0xc000074118
)/usr/lib/go-
1.14
/src/internal/poll/fd_mutex.go:
154+
0xad
執行後系統就會報錯, 無論是socket需要的資源,還是go協程需要至少 2kb記憶體等,系統資源都會被消耗光。
解決: 可以使用chan人為的限制併發個數
例:
package main
import
("fmt"
"sync"
"time"
)func
main()
,10000
)// 限制快取池10000條
for i :=
0; i <
1000
*1000
*1000
; i++
// 當池滿後阻塞
wg.add(1)
gofunc
(i int
)(i)
} wg.
wait()
}
思路:
1、建立 1w 條容量的管道作為緩衝池。
2、主程序中每建立乙個協程時寫入緩衝池。
3、每個協程結束後釋放管道。
保證協程同時只有指定數量的協程在處理任務,不至於耗盡計算機資源。
Go語言併發列印(借助通道實現)
之前的例子建立的都是無緩衝通道。使用無緩衝通道往裡面裝資料時,裝入方將被阻塞,直到另外通道在另乙個goroutine中被取出,同時,如果通道中沒有放入任何資料,接收方試圖從通道中獲取資料時,同樣也是阻塞。傳送和接收的操作是同步完成的。下面介紹乙個併發列印的例子,將goroutine和channel放...
Go從入門到精通 示例 併發列印
使用無緩衝通道往裡面裝入資料時,裝入方將被阻塞,直到另外通道在另外乙個 goroutine 中被取出。同樣,如果通道中沒有放入任何資料,接收方試圖從通道中獲取資料時,同樣被阻塞。傳送和接收的操作是同步完成的。package main import fmt func printer c chan in...
Go語言併發
協程 本質上是一種使用者態執行緒,不需要作業系統來進行搶占式排程,且在真正的實現重寄存於執行緒中,因此,系統開銷極小,可以有效提高執行緒的任務併發性,從而避免多執行緒的缺點。使用協程的優點是程式設計簡單,結構清晰 缺點是需要語言的支援。協程最大優勢 輕量級 可以輕鬆建立上百萬個而不會導致系統資源衰竭...