英文:
Http GET requests over one tls connection using Go
问题
目前,我正在使用HTTP GET请求与服务器建立连接。
Get
请求是从线程内部调用的。对于每个Get
请求,都使用一个线程,但问题是对于每个Get
请求,都会建立一个连接。因此,如果有10000个Get
请求,将建立10000个连接。然而,我希望首先在我和服务器之间建立一个TLS连接,然后创建一个线程,并从该线程中通过已经建立的连接发送Get
请求。
例如:
for {
1. 建立TLS连接
2. 创建线程 go func()
}
func() {
resp, err := http.Get(url) // 应该通过已经建立的TLS连接发送
}
英文:
Currently, I am using http GET requests to connect to a server.
Get
request is calling from inside a thread. For each Get
request one thread is being used but problem is for each Get
request, one connection is established. Thus if there are 10000 Get
request then 10000 connections will be established. However, I want first to establishe a TLS connection between me and the server, then create a thread and from that thread I want to send Get
over that already established connection.
e.g.
for {
1. establish a tls connection
2. create thread go func()
}
func() {
resp, err := http.Get(url) // should be over already established tls connection
}
答案1
得分: 2
首先,澄清一下,Go语言使用的是goroutines,而不是线程。Goroutines是协作式轻量级进程。Go运行时将一些goroutines分配到可用的操作系统线程上进行时间片切换。这种线程抽象是Go语言的一个重要特性。
关于使用goroutines进行并发GET请求的问题,最好的方法是最初让标准API来处理请求在连接上的多路复用。可能会有大量的请求和较少的支持连接。只要使用保持活动连接(keep-alive connections),你就不需要关心细节。
如果需要对代理、TLS配置、保持活动连接、压缩和其他设置进行控制,可以创建一个Transport。
HTTP/1.1可以同时处理http和https的保持活动连接。当向同一服务器发出多个请求时,这是一个好处。只要不在每个请求之后强制关闭连接,你将从保持活动连接中获得很多好处。
通常的原则是:不要过早地进行优化。尽可能清楚地描述你需要做什么。对其进行基准测试(Go语言有一个有用的微基准测试工具)。在决定是否以及如何优化性能之前,请先进行基准测试。
英文:
Firstly, just to clarify, Go has goroutines, not threads. Goroutines are co-operative light-weight processes. The Go runtime time-slices a number of goroutines onto the available operating system threads. This thread abstraction is an important feature of Go.
On the question of making many concurrent GET requests using goroutines, it is best initially to let the standard API handle multiplexing of requests onto connections for you. There may be a large number of requests and a smaller number of supporting connections. Provided you use keep-alive connections, you should not need to care about the details.
For control over proxies, TLS configuration, keep-alives, compression, and other settings, create a Transport
HTTP/1.1 handles keep-alive connections with both http and https. This is a benefit when many requests are made to the same server. As long as you don't force it to close each connection after each request, you will get a lot of benefit from keep-alive connections in your case.
The usual mantra applies: don't optimise prematurely. Describe what you need to do as clearly as possible. Benchmark it (Go has a useful micro-benchmark tool). Do this before you decide whether or how to optimise the performance.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论