RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 823608
Accepted
babyborn
babyborn
Asked:2020-05-05 21:05:00 +0000 UTC2020-05-05 21:05:00 +0000 UTC 2020-05-05 21:05:00 +0000 UTC

如何加快发送 3 个 GET 请求

  • 772

大家好!有 3 个 GET 请求

r1 = requests.get('http://mysite.com/check.php?' + 'userid=666&userage=18')
r2 = requests.get('http://mysite.com/check.php?' + 'userid=777&userage=22')
r3 = requests.get('http://mysite.com/check.php?' + 'userid=888&userage=26')

发送它们并收到响应需要很长时间,如何减少这个时间?这三个请求减慢了整个程序。

python
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. gil9red
    2020-05-05T22:31:01Z2020-05-05T22:31:01Z

    请求可以通过线程并行化。

    遍历所有元素后,结果将在results:

    import requests
    from multiprocessing.dummy import Pool as ThreadPool
    
    
    urls = [
        'http://mysite.com/check.php?userid=666&userage=18',
        'http://mysite.com/check.php?userid=777&userage=22',
        'http://mysite.com/check.php?userid=888&userage=26',
    ]
    
    pool = ThreadPool()
    results = pool.map(requests.get, urls)
    print(results)
    

    PS。虽然multiprocessing它指的是进程中的处理,但它的模块multiprocessing.dummy是通过线程工作的。

    附言 执行结果results会保存在 中requests.get(url),你可以在之后进行处理,例如:

    for x in results:
        print(x, len(x.content), x.content)
    
    • 2
  2. Best Answer
    Stranger6667
    2020-05-05T21:17:28Z2020-05-05T21:17:28Z

    一种选择是使用异步。

    import asyncio
    import requests
    
    async def main():
        loop = asyncio.get_event_loop()
        future1 = loop.run_in_executor(None, requests.get, 'http://mysite.com/check.php?userid=666&userage=18')
        future2 = loop.run_in_executor(None, requests.get, 'http://mysite.com/check.php?userid=777&userage=22')
        future3 = loop.run_in_executor(None, requests.get, 'http://mysite.com/check.php?userid=888&userage=26')
        response1 = await future1
        response2 = await future2
        response3 = await future3
        print(response1.text)
        print(response2.text)
        print(response3.text)
    
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())
    

    这里有详细描述

    更新。如果需要设置标题,可以使用functools.partial:

    future1 = loop.run_in_executor(None, functools.partial(requests.get, 'http://httpbin.org/get', headers={'Test': '1'}))
    

    或者使用 aiohttp:

    import asyncio
    from aiohttp import ClientSession
    
    
    async def fetch(url, session):
        async with session.get(url, headers={'key': 'value'}) as response:
            return await response.read()
    
    async def run():
        urls = (
            'http://mysite.com/check.php?userid=666&userage=18',
            'http://mysite.com/check.php?userid=777&userage=22',
            'http://mysite.com/check.php?userid=888&userage=26',
        )
    
        async with ClientSession() as session:
            tasks = [
                asyncio.ensure_future(fetch(url, session))
                for url in urls
            ]
            responses = await asyncio.gather(*tasks)
            print(responses)
    
    
    loop = asyncio.get_event_loop()
    future = asyncio.ensure_future(run())
    loop.run_until_complete(future)
    

    此外,您可以考虑缓存查询结果(如果任务上下文允许),例如使用 redis(https://github.com/vivekn/redis-simple-cache作为选项)。

    from redis_cache import cache_it, SimpleCache
    
    
    my_cache = SimpleCache(expire=60)
    
    
    @cache_it(cache=my_cache)
    def get_data(url):
        ...
    
    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5