Python 3.x 使用aiohttp阻塞请求
当我在两个不同的选项卡中并行运行时,请检查下面的脚本(python3-main)。request2仅在request1结束后启动。每个新请求都会被上一个请求阻止。 感谢您的帮助Python 3.x 使用aiohttp阻塞请求,python-3.x,server,aiohttp,Python 3.x,Server,Aiohttp,当我在两个不同的选项卡中并行运行时,请检查下面的脚本(python3-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.ra
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()
这令人惊讶地难以确定,但事实证明run_应用程序被阻塞了。关于这一点,这个有点含糊不清,但在另一个页面上,它明确地将其称为阻塞。文档中有很多关于在生产中为应用程序提供服务的不同方法,这些方法会更好
编辑:注释中的第二点:从不同选项卡发送请求不会被识别为不同的来源,因此这不会按预期的方式工作。但是,如果您使用“匿名”选项卡,它将起作用。如果您使用run_app的原始示例执行此操作(1 tab normal,1 incognito),您将看到它仍然处于阻塞状态。如果将第二个示例的AppRunner与两个选项卡(1个tab normal,1个incognito)一起使用,您将看到它不再阻塞。如果在同一浏览器会话中使用带有两个选项卡的AppRunner,则它将被阻塞 这里的问题是
时间。sleep(1)
这是一个阻塞调用;对于像aiohttp这样的异步框架,您需要尽可能多地使用异步库。在这种情况下,您需要等待asyncio.sleep而不是time.sleep。@IonutTicus您好,我将time.sleep更改为等待asyncio.sleep(1)。但req2仍仅在req1结束后启动。Req1:output名称的开始计数996 2020-05-11 11:18:06.991487值0 2020-05-11 11:18:17.022582
和Req2 output名称的开始计数139 2020-05-11 11:18:17.024334值0 2020-05-11:18:27.054835
如果使用单个浏览器并尝试相同的URL,浏览器将识别您正在尝试加载URL在两个不同的选项卡中显示相同的页面,并延迟第二个请求,直到第一个请求完成。尝试向URL添加一个参数,如x=random_number
,或者使用单独的浏览器或类似curl/wget.com的东西。试图寻找其他方法。文件很难理解。你能指出一些服务器应用程序的资源吗?我回答中的第二个链接建议使用AppRunner,这可能对你有用。否则,文档中的部署页面有一些选项:我现在正在使用apprunner。来自同一浏览器的请求被阻止。是否存在任何此类限制。添加了一些详细信息,但对我来说,你的app runner解决方案有效。。。如果你使用匿名标签。如果您在尝试时发现相同的问题,请告诉我。