首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >请求与请求期货-响应时间不准确?

请求与请求期货-响应时间不准确?
EN

Stack Overflow用户
提问于 2015-04-23 16:01:29
回答 1查看 1.9K关注 0票数 3

我有Python代码,它运行10个GET请求并测量响应时间:

代码语言:javascript
复制
from datetime import datetime
from requests_futures.sessions import FuturesSession
import requests

class CustomSession(FuturesSession):

    def __init__(self, *args, **kwargs):
        super(CustomSession, self).__init__(*args, **kwargs)
        self.timing = {}
        self.timing = {}

    def request(self, method, url, *args, **kwargs):
        background_callback = kwargs.pop('background_callback', None)
        test_id = kwargs.pop('test_id', None)

        # start counting
        self.timing[test_id] = {}
        self.timing[test_id]['cS'] = datetime.now()

        def time_it(sess, resp):
            # here if you want to time the server stuff only
            self.timing[test_id]['cE'] = datetime.now()
            if background_callback:
                background_callback(sess, resp)
            # here if you want to include any time in the callback

        return super(CustomSession, self).request(method, url, *args,
                                                  background_callback=time_it,
                                                  **kwargs)

# using requests-futures

print('requests-futures:')

session = CustomSession()

futures = []
for i in range(10):

    futures.append(session.get('http://google.com/', test_id=i))
for future in futures:
    try:
        r = future.result()
        #print((session.timing[i]['cE'] - session.timing[i]['cS']))
    except Exception as e:
        print(e)
for i in range(10):
    print((session.timing[i]['cE'] - session.timing[i]['cS']).total_seconds() * 1000)


# using requests

print('requests:')

for i in range(10):

    check_start_timestamp = datetime.utcnow()
    r = requests.get('http://google.com')
    check_end_timestamp = datetime.utcnow()
    cE = int((check_end_timestamp - check_start_timestamp).total_seconds() * 1000)
    print(cE)

请求-期货:

代码语言:javascript
复制
112.959
118.627
160.139
174.32
214.399
224.295
267.557
276.582
316.824
327.00800000000004

请求:

代码语言:javascript
复制
99
104
92
110
100
126
140
112
102
107

看来:

  1. requests-futures的响应时间看起来是相加的(时间越来越长)
  2. 使用普通的requests运行速度快得多。

这是正常的吗?我是不是遗漏了什么会导致这种差异的东西?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-23 20:53:07

问题1

请求的响应时间-期货看起来是加性的(时间越来越大)

原因是requests_futures在幕后使用线程池。您可以看到这一点,因为计时发生在块中(为清楚起见添加的分隔符,线程数可以由max_workers参数更改):

  • 默认池大小为2: 161.226 172.41600000000003 - 250.141 253.18600000000004 - 329.32800000000003 342.71000000000004 - 408.21200000000005 420.614 - 487.356 499.311
  • 泳池大小为4: 149.781 154.761 151.971 155.385 -- 225.458 230.596 239.784 240.386 -- 313.801 314.056
  • 图(蓝色为2,红色为4):

如您所见,组的间隔大致相同,这应该是一个请求的响应时间。

理论上,将池大小设置为10为您的测试提供了最佳结果,给出的结果如下:

代码语言:javascript
复制
252.977
168.379
161.689
165.44
169.238
157.929
171.77
154.089
168.283
159.23999999999998

然而,下面的效果会产生更多的效果。

问题2

使用普通请求运行得更快。

我不确定,但看看第一批请求的时间,它只有15个单位(微秒?)关了。这可能是由于:

  • 线程切换由于正常的请求请求发生在与请求者相同的线程中,所以作业立即开始。对于线程池,只有当OS切换到正确的线程时才启动请求。这将导致一段时间的开销。
  • 投票。期货可能使用某种形式的投票来检查结果,因此也可能会出现延迟。

未来的优势是,10次请求的总时间更短,而不是单个的时间,因此这种细微的差异并不是真正值得关注的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29828734

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档