Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 使用aiohttp阻塞请求_Python 3.x_Server_Aiohttp - Fatal编程技术网

Python 3.x 使用aiohttp阻塞请求

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

当我在两个不同的选项卡中并行运行时,请检查下面的脚本(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.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解决方案有效。。。如果你使用匿名标签。如果您在尝试时发现相同的问题,请告诉我。