【问题标题】:Using grequests to send a pool of requests, how can I get the response time of each individual request?使用 grequests 发送请求池,如何获取每个请求的响应时间?
【发布时间】:2012-12-10 21:35:34
【问题描述】:

我正在使用 grequests python 库将 GET 请求异步发送到我们的服务器。

我不知道如何获取正在发送的请求池中每个单独请求的服务器响应时间?

unsentrequests=(grequests.get(u) for u in self.urls) # make a pool of requests
responses=grequests.map(unsentrequests) # send the requests asynchronously

要获取请求-响应对的开始时间,我可以执行以下操作:

grequests.get(u,headers={'start':time.time())
print responses[0].request.headers['start_time']

但是我怎样才能知道收到响应的时间呢?

【问题讨论】:

标签: python-requests grequests


【解决方案1】:

grequestsrequests 一样,支持hook 关键字参数,您可以在其中分配一个对响应对象执行某些操作的函数:

def do_something(response):
    print response.status_code

unsentrequests=(grequests.get(u, hooks = {'response' : do_something}) for u in self.urls) 
responses=grequests.map(unsentrequests)

我更喜欢在使用gevent 的循环中直接使用requests 以获得更明确的代码:

import gevent.monkey
gevent.monkey.patch_socket()
from gevent.pool import Pool
import requests

def check_urls(urls):

    def fetch(url):
        response = requests.request('GET', url, timeout=5.0)
        print "Status: [%s] URL: %s" % (response.status_code, url)

    pool = Pool(20)
    for url in urls:
        pool.spawn(fetch, url)
    pool.join()

【讨论】:

  • 为什么要把 fetch() 函数作为 check_urls() 的子函数呢? (我只是在学习 python,所以我试图弄清楚 adv 是什么,而不是把它放在更一般的范围内)
  • 没有任何理由,只是我是一个糟糕的程序员 ;-) 除了笑话你可以重写我的代码在主函数之外定义fetch
  • 这不是仅在每 20 个请求后打印状态吗?有没有办法在每个池大小> 1的请求后打印状态?
猜你喜欢
  • 2018-05-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-06
  • 1970-01-01
相关资源
最近更新 更多