GO 併發列印上億條資訊而不崩潰

2021-10-22 20:38:30 字數 1231 閱讀 2730

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語言併發

協程 本質上是一種使用者態執行緒,不需要作業系統來進行搶占式排程,且在真正的實現重寄存於執行緒中,因此,系統開銷極小,可以有效提高執行緒的任務併發性,從而避免多執行緒的缺點。使用協程的優點是程式設計簡單,結構清晰 缺點是需要語言的支援。協程最大優勢 輕量級 可以輕鬆建立上百萬個而不會導致系統資源衰竭...