1. 程式人生 > >golang限制協程數量

golang限制協程數量

雖然golang中協程開銷很低,但是在一些情況下還是有必要限制一下協程的開啟數,比如爬蟲中的下載協程,因為受到頻寬限制,開的多了也沒有效果。本來想在網上找找有沒協程池,類似其它語言執行緒池這樣的東西,可以限制最大開啟數。找了一番,這方面的資料非常少,難道golang不需要協程池這種東東?自己動手寫一個吧。

要限制協程最大數量,就是考慮開啟一個協程的時候記錄一下,然後超過最大數就不再開啟。可以考慮用一個變數count來記錄協程開啟數量,不過這種方式比較out了,golang中可以用channel來實現。

不限制的程式碼:

package main

import (
    "fmt"
"strconv" "time" ) // 模擬下載頁面的方法 func download(url string) { fmt.Println("download from ", url) } func main() { urls := [100]string{} for i := 0; i < 100; i++ { urls[i] = "url" + strconv.Itoa(i) } for i := 0; i < len(urls); i++ { go download(urls[i]) } // 休眠一下
for { time.Sleep(1 * 1e9) } }

根據url數量開啟若干協程,每個協程會去下載頁面內容,通常受到頻寬的限制,協程開多了沒有什麼提升效果。

限制一下

package main

import (
    "fmt"
    "strconv"
    "time"
)

var (
    maxRoutineNum = 10
)

// 模擬下載頁面的方法
func download(url string, ch chan int) {
    fmt.Println("download from ", url)
    // 休眠兩秒模擬下載頁面
time.Sleep(2 * 1e9) // 下載完成則從ch推出資料 <-ch } func main() { ch := make(chan int, maxRoutineNum) urls := [100]string{} for i := 0; i < 100; i++ { urls[i] = "url" + strconv.Itoa(i) } for i := 0; i < len(urls); i++ { // 開啟下載協程前往ch塞一個數據 // 如果ch滿了則會處於阻塞,從而達到限制最大協程的功能 ch <- 1 go download(urls[i], ch) } // 休眠一下 for { time.Sleep(1 * 1e9) } }

主要就是用golang中channel的阻塞性和最大數量處理,可以考慮封裝一下提供使用。

golang真的不需要協程池?

相關推薦

golang限制數量

雖然golang中協程開銷很低,但是在一些情況下還是有必要限制一下協程的開啟數,比如爬蟲中的下載協程,因為受到頻寬限制,開的多了也沒有效果。本來想在網上找找有沒協程池,類似其它語言執行緒池這樣的東西,可以限制最大開啟數。找了一番,這方面的資料非常少,難道gola

Golang goroutine(二)

“子程式就是協程的一種特例。” - - Donald Knuth 普通函式,一個執行緒內有個main函式調一個叫doSomeWork的函式,等doSomeWork做完以後才會將控制權交還給main函式,然後main函式執行下一個語句

Golang goroutine(五)

Golang 的通道選擇器 可以同時等待多個通道操作。 Go 協程和通道以及選擇器的結合是 Go 的一個強大特性。 // Go 的_通道選擇器_ 讓你可以同時等待多個通道操作。 // Go 協程和通道以及選擇器的結合是 Go 的一個強大特性。 package main

Golang goroutine(四)

通道方向 : 當使用通道作為函式的引數時,可以指定這個通道是不是隻用來發送或者接收值。這個特性提升了程式的型別安全性。 func ping(pings chan<- string, msg string) { pings <- msg //

Golang goroutine(三)

“通道” 是連線多個 Go 協程的管道。 可以從一個 Go 協程, 將值傳送到通道,然後在別的 Go 協程中接收。 package main import "fmt" func main() { // 使用 `make(chan val-type)` 建立

Golang詳解

一、Golang 執行緒和協程的區別   備註:需要區分程序、執行緒(核心級執行緒)、協程(使用者級執行緒)三個概念。  程序、執行緒 和 協程 之間概念的區別   對於 程序、執行緒,都是有核心進行排程,有 CPU 時間片的概念,進行 搶佔式排程(有多種排程演

golang優雅退出

sync包中的Waitgroup結構,是Go語言為我們提供的多個goroutine之間同步的好刀。下面是官方文件對它的描述: A WaitGroup waits for a collection of goroutines to finish. The main goroutine calls Add t

Golang排程機制 與 GOMAXPROCS 效能調優

作者:林冠巨集 / 指尖下的幽靈 前序 正確地認識 G , M , P 三者的關係,能夠對協程的排程機制有更深入的理解! 本文將會完整介紹完 go 協程的排程機制,包含: 排程物件的主要組成 各物件的關係 與 分工 gorutine 協程是如何被執行的 核心執行緒 sysmon 對 goru

golang和通道的分析

每個協程對應於每個併發的事件,程式可以不用協程,這樣執行的效率不如用協程的要快。 同時執行的協程數,與cpu數進行匹配最合適,否則會出現deadlock。 協程間的通訊,通過chan來實現,而多個chan可以組成管道,來順序的傳遞資料。 <-在chan的左側是用於輸出

關於:nodejs和golang的不同

eight fun 插入 ber ise 最大 機制 引用 data nodejs和golang都是支持協程的,從表現上來看,nodejs對於協程的支持在於async/await,golang對協程的支持在於goroutine。關於協程的話題,簡單來說,可以看作是非搶占式的

Golang原始碼探索(二) 的實現原理

轉自:https://studygolang.com/articles/11627 Golang最大的特色可以說是協程(goroutine)了, 協程讓本來很複雜的非同步程式設計變得簡單, 讓程式設計師不再需要面對回撥地獄, 雖然現在引入了協程的語言越來越多, 但go中的協程仍然是實現的是最徹底

golang語言漸入佳境[20]-與通道

協程引入 通過狀態檢查器checkLink,不斷的獲取切片當中的網址,並且列印了出來。順序執行。這也就意味著,一旦我訪問google.com等網站就會陷入到等待的狀況中。後面的網址無法訪問。 1234567891011121314151617181920212223242526

Golang 入門系列(六)理解Go中的(Goroutine)

今天就來講講go 裡面的高階功能,也是go語言重要的特性:Go協程(Goroutine)。 什麼是Go協程 Go協程(Goroutine)是與其他函式同時執行的函式。可以認為Go協程是輕量級的執行緒,由Go執行時來管理。 在函式呼叫前加上go關鍵字,這次呼叫就會在一個新的goroutine中併發執行。當被

Golang教程:(二十一)

在上一篇教程中,我們討論了併發,以及併發和並行的區別。在這篇教程中我們將討論在Go中如何通過Go協程實現併發。 什麼是協程 Go協程(Goroutine)是與其他函式或方法同時執行的函式或方法。可以認為Go協程是輕量級的執行緒。與建立執行緒相比,建立

【我的區塊鏈之路】- golang原始碼分析之排程器底層實現( G、M、P)

本人的原始碼是基於go 1.9.7 版本的哦! 緊接著之前寫的 【我的區塊鏈之路】- golang原始碼分析之select的底層實現 和 【我的區塊鏈之路】- golang原始碼分析之channel的底層實現 我們這一次需要對go的排程器做一番剖析。

golang學習筆記(二)—— 深入golang中的

小白一枚,最近在研究golang,記錄自己學習過程中的一些筆記,以及自己的理解。 go中協程的實現 go中協程的sync同步鎖 go中通道channel go中的range go中的select切換協程 go中帶快取的channel go中協程排程

golang資源佔有率

GO版本:go version go1.4.2 linux/amd64 執行協程只需要極少的棧記憶體(大概是4~5KB),預設情況下,執行緒棧的大小為1MB。 Apache。 持續幾秒的短期連線,比如快速事務,如果每秒處理1000個事務,只有約1000個併發連線到伺服器。 事務延長到10秒,要維持每秒1

Golang併發模型:併發的優雅退出

goroutine作為Golang併發的核心,我們不僅要關注它們的建立和管理,當然還要關注如何合理的退出這些協程,不(合理)退出不然可能會造成阻塞、panic、程式行為異常、資料結果不正確等問題。這篇文章介紹,如何合理的退出goroutine,減少軟體bug。 goroutine在退

Golang 控制關閉

部分程式碼參考:https://zhuanlan.zhihu.com/p/26695984   這邊文章的的 package main import ( "context" "fmt" "time" ) func main() { ctx := context

Python使用Semaphore訊號量同步機制限制併發量

from aiohttp import ClientSession import asyncio ###################### # 限制協程併發量 ###################### async def hello(sem, url): asyn