2015-04-01 49 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