使用aiohttp的阻止请求

问题描述 投票:1回答:1

[当我在两个不同选项卡中并行运行http://0.0.0.0:8080/run1时,请检查以下脚本(python3 -m main)。 request2仅在request1结束后才开始。每个新请求都被前一个请求阻止。任何帮助表示赞赏。

from aiohttp import web
import random
import time
from datetime import datetime


async def f1(request):
    res_text = "Starting count for name" + str(random.randint(1, 1000))
    res_text += "\n"
    res_text += str(datetime.now())
    res_text += "\n"
    for i in range(10):
        res_text += f"Value {i}"
        res_text += "\n"
        time.sleep(1)
    res_text += str(datetime.now())
    return web.Response(text=res_text)

app = web.Application()
app.router.add_get('/run1', f1)

if __name__ == '__main__':
    web.run_app(app)

根据建议更新了请求:

from aiohttp import web
import random
import time
from datetime import datetime
import asyncio

async def f1(request):
    res_text = "Starting count for name" + str(random.randint(1, 1000))
    res_text += "\n"
    res_text += str(datetime.now())
    res_text += "\n"
    for i in range(10):
        res_text += f"Value {i}"
        res_text += "\n"
        await asyncio.sleep(1)
    res_text += str(datetime.now())
    return web.Response(text=res_text)

app = web.Application()
app.router.add_get('/run1', f1)

async def start_app():
    runner = web.AppRunner(app)
    await runner.setup()
    site = web.TCPSite(runner)
    await site.start()
    return runner, site

loop = asyncio.get_event_loop()
runner, site = loop.run_until_complete(start_app())
try:
    loop.run_forever()
except KeyboardInterrupt as err:
    loop.run_until_complete(runner.cleanup())

loop.close()
python-3.x server aiohttp
1个回答
1
投票

这令人难以置信,但事实证明run_app正在阻止。 documentation对此有点含糊,但是在另一页上,它明确地将其称为阻塞process。文档中有很多关于可以更好地在生产环境中为应用提供服务的方式的信息。

© www.soinside.com 2019 - 2024. All rights reserved.