Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python requests.exceptions.ConnectionError在使用不同进程调用golang REST API的请求时_Python_Rest_Go_Request - Fatal编程技术网

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