Python requests.exceptions.ConnectionError在使用不同进程调用golang REST API的请求时
我用Python requests.exceptions.ConnectionError在使用不同进程调用golang REST API的请求时,python,rest,go,request,Python,Rest,Go,Request,我用go编写了简单的RESTAPI。我使用pythonrequest库使用不同的进程多次测试调用它。但我遇到了请求.异常.ConnectionError(下面是更详细的消息)。这让我感到惊讶,因为我希望服务器能够处理并行请求。出于好奇,我在go中实现了python版本,但无法重现错误 以下是我的REST API的代码: package main import ( "net/http" "strconv" "fmt" ) func make_result(w http.
go
编写了简单的RESTAPI。我使用python
request
库使用不同的进程多次测试调用它。但我遇到了请求.异常.ConnectionError
(下面是更详细的消息)。这让我感到惊讶,因为我希望服务器能够处理并行请求。出于好奇,我在go
中实现了python
版本,但无法重现错误
以下是我的REST API的代码:
package main
import (
"net/http"
"strconv"
"fmt"
)
func make_result(w http.ResponseWriter, r *http.Request) {
fmt.Println(r)
err := r.ParseForm()
if err != nil {
panic(err)
}
number_string := r.Form["Number"][0]
number, err := strconv.Atoi(number_string)
if err != nil {
panic(err)
}
fmt.Fprint(w, fmt.Sprint(number * 5))
}
我用python
,timer.py
调用它:
import requests
from time import time
import random as rn
import sys
def time_get_requests(n_iterations):
start = time()
total = 0
for i in xrange(n_iterations):
if i % 1000 == 0:
print "processed: {} requests, time taken: {}".format(i, time() - start)
n = rn.randint(0, 1000)
temp = requests.get("http://localhost:8000/get_result", params={"Number": n})
total += int(temp.content)
print "Total: {}".format(total)
print "Total time: {}".format(time() - start)
if __name__ == "__main__":
time_get_requests(int(sys.argv[1]))
我正在使用go
,定时器呼叫。go
:
package main
import(
"time"
"math/rand"
"strconv"
"log"
"os"
"github.com/parnurzeal/gorequest"
)
func main() {
rand.Seed( time.Now().UTC().UnixNano())
n_iterations, err := strconv.Atoi(os.Args[1])
if err != nil {
panic(err)
}
total := 0
start := time.Now()
request := gorequest.New()
for i := 0; i < n_iterations; i++ {
if i % 1000 == 0 {
log.Printf("%d: Time taken: %v\n", i, time.Now().Sub(start))
}
rand_int := rand.Intn(1000)
rand_int_str := strconv.Itoa(rand_int)
_, body, errs := request.
Get("http://localhost:8000/get_result").
Param("Number", rand_int_str).
End()
if len(errs) > 0 {
log.Fatalf("\033[0;31m%v\033[0m\n", errs)
}
int_body, err := strconv.Atoi(body)
if err != nil {
panic(err)
}
total += int_body
}
log.Printf("Total: %d\n", total)
total_time_taken := time.Now().Sub(start)
log.Printf("Total time: %v\n", total_time_taken)
}
及
(当我在一个处理器上运行时,两条线都运行良好)
我收到的错误消息:
resp = self.send(prep, **send_kwargs)
File "/usr/lib/python2.7/dist-packages/requests/sessions.py", line 558, in sen
d
raise ConnectionError(e)
requests.exceptions.ConnectionError: HTTPConnectionPool(host='localhost', port=8
000): Max retries exceeded with url: /get_result?Number=850 (Caused by <class 's
ocket.error'>: [Errno 99] Cannot assign requested address)
r = adapter.send(request, **kwargs)
File "/usr/lib/python2.7/dist-packages/requests/adapters.py", line 378, in send
resp=self.send(准备,**发送)
文件“/usr/lib/python2.7/dist packages/requests/sessions.py”,第558行,在sen中
D
升起连接器错误(e)
requests.exceptions.ConnectionError:HTTPConnectionPool(host='localhost',port=8
000):url:/get_result?Number=850超出了最大重试次数(原因:[Errno 99]无法分配请求的地址)
r=适配器.send(请求,**kwargs)
文件“/usr/lib/python2.7/dist packages/requests/adapters.py”,第378行,在send中
我的主要问题是:为什么我的python
部分(timer.py
)会导致这个错误?我该怎么做才能修好它?(我不知道我的问题是REST API还是如何使用请求
)
我的第二个问题:timer.go
为什么工作正常
我正在使用:
go 1.5
,python 2.7.6
,requests 2.2.1
,ubuntu 14.04
,您试过了吗?更清楚地说,这可能表明您的python客户端的TCP临时端口已耗尽。因此,我将首先使用适当的工具进行检查,该工具能够适当地管理其套接字预算,以便在被测服务上创建尽可能恒定的工作负载。@kostix,谢谢您提供的信息!如果您感兴趣的话,我不知道如何使用wrk
获取参数并在这里询问它的api。对于不带参数的api,我无法使用请求
再现错误。是否尝试了?更清楚地说,这可能表明Python客户端的TCP临时端口已用尽。因此,我将首先使用适当的工具进行检查,该工具能够适当地管理其套接字预算,以便在被测服务上创建尽可能恒定的工作负载。@kostix,谢谢您提供的信息!如果您感兴趣的话,我不知道如何使用wrk
获取参数并在这里询问它的api。对于不带参数的api,我无法使用请求
再现错误。
for i in {0..7}; do go run timer.go 20000 & done
resp = self.send(prep, **send_kwargs)
File "/usr/lib/python2.7/dist-packages/requests/sessions.py", line 558, in sen
d
raise ConnectionError(e)
requests.exceptions.ConnectionError: HTTPConnectionPool(host='localhost', port=8
000): Max retries exceeded with url: /get_result?Number=850 (Caused by <class 's
ocket.error'>: [Errno 99] Cannot assign requested address)
r = adapter.send(request, **kwargs)
File "/usr/lib/python2.7/dist-packages/requests/adapters.py", line 378, in send