2015-04-01 50 views
0

目前,我正在使用http GET請求連接到服務器。 Get請求正在從一個線程內部調用。對於每個Get請求,正在使用一個線程,但問題是每個Get請求都建立一個連接。因此,如果有10000 Get請求,則將建立10000個連接。但是,我希望首先在我和服務器之間建立一個TLS連接,然後創建一個線程,並從該線程中通過已建立的連接發送Get通過一個tls連接使用Go的HTTP GET請求

例如

for { 
    1. establish a tls connection 
    2. create thread go func() 
} 

func() { 
    resp, err := http.Get(url) // should be over already established tls connection 
} 

回答

2

首先,我只想澄清,Go有夠程,而不是線程。 Goroutines是合作輕質過程。 Go運行時間將大量goroutine分割到可用的操作系統線程上。這個線程抽象是Go的一個重要特性。

在使用goroutine創建許多併發GET請求的問題上,最好先讓標準API處理多個請求到您的連接。可能有大量請求和較少數量的支持連接。假如你使用keep-alive連接,你不需要關心細節。

在過去的代理控制,TLS配置,保持有效指示,壓縮,以及其他設置,create a Transport

HTTP/1.1手柄保持活動與HTTP和HTTPS連接。當許多請求發送到同一臺服務器時,這是一個好處。只要你不要強制它在每次請求後關閉每個連接,你會從你的情況下的保持連接中獲得很多好處。

通常的口頭禪適用:不要過早優化。儘可能清楚地描述你需要做的事情。基準測試(Go有一個有用的微基準測試工具)。在決定是否或如何優化性能之前執行此操作。

+0

感謝瑞克的支持,但我擔心的是,只有一個連接和多個請求可能通過同一連接?如果不是Go的另一種做法是什麼? – 2015-04-01 10:52:47

+3

每個[Transport](http://golang.org/src/net/http/transport.go)實例都有一個連接池。使用給定傳輸的http [客戶端](http://golang.org/pkg/net/http/#Client)將爲其請求使用這些連接。因此,首先假設標準API將非常有效地工作,並且您不必擔心連接和池。只有在您嘗試過之後,纔會測量它,發現它太慢,因此您應該開始尋找替代方案。 – 2015-04-01 12:39:21