【问题标题】:Python 3 aiohttp | Optimize server response timePython 3 aiohttp |优化服务器响应时间
【发布时间】:2023-04-09 15:43:01
【问题描述】:
from aiohttp import web
from aiohttp import ClientSession

# this would go in a different file but keep it simple for now
class Generate:

    # Get a person object from my website
    async def get_person(self):
        async with ClientSession() as session:
            async with session.get('http://surveycodebot.com/person/generate') as response:
                resp = await response.json()
                # this prints the person
                print(resp)
                return resp

    # loops `get_person` to get more than 1 person
    async def get_people(self):
        # array for gathering all responses
        for _ in range(0,10):
            resp = await self.get_person()
        return resp

# class to handle '/'   
class HomePage(web.View):
    async def get(self):
        # initiate the Generate class and call get_people 
        await Generate().get_people()
        return web.Response(text="Hello, world")

if __name__ == "__main__":
    app = web.Application()
    app.router.add_get('/', HomePage)
    web.run_app(app)

代码有效,一切都很好。我想知道为什么HomePage 需要一段时间才能加载。我认为我应该在第 28 行使用 yield,但是当我这样做时它会出错。谢谢。

【问题讨论】:

  • 看起来如果我将 url 更改为另一台服务器,它的工作速度会更快。看起来代码需要优化发出 Get 请求的服务器代码。即将http://surveycodebot.com/person/generate 更改为https://jsonplaceholder.typicode.com/posts 如果有优化的方法,请告诉我。

标签: python python-3.x async-await python-asyncio aiohttp


【解决方案1】:

您可以通过 aiohttp on_startup 信号在多个客户端请求之间共享会话来进行优化。

如下所示:

import asyncio
from aiohttp import web
from aiohttp import ClientSession


class Generate:

    def __init__(self, session):
        self.session = session

    # Get a person object from my website
    async def get_person(self):
        async with self.session.get('http://surveycodebot.com/person/generate') as response:
            resp = await response.json()
            # this prints the person
            print(resp)
            return resp

    # loops `get_person` to get more than 1 person
    async def get_people(self):
        # array for gathering all responses
        for _ in range(0,10):
            resp = await self.get_person()
        return resp

# class to handle '/'   
class HomePage(web.View):
    async def get(self):
        # initiate the Generate class and call get_people 
        await app['generate'].get_people()
        return web.Response(text="Hello, world")


async def on_startup(app):
    session = ClientSession()
    app['generate'] = Generate(session)



if __name__ == "__main__":
    app = web.Application()
    app.router.add_get('/', HomePage)
    app.on_startup.append(on_startup)
    web.run_app(app)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 2022-07-25
    • 1970-01-01
    • 2012-02-07
    • 2017-06-28
    • 1970-01-01
    相关资源
    最近更新 更多