Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.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
Windows上的Sanic Python,同一端点上的同步行为-这是预期的吗?_Python_Asynchronous_Python Asyncio_Sanic - Fatal编程技术网

Windows上的Sanic Python,同一端点上的同步行为-这是预期的吗?

Windows上的Sanic Python,同一端点上的同步行为-这是预期的吗?,python,asynchronous,python-asyncio,sanic,Python,Asynchronous,Python Asyncio,Sanic,琐碎的问题,可能被问过几次。 我知道Sanic可以在Windows上运行(即检测到uvloop的缺失,但决不能减少回退和按下) 我的问题是,它是否仍会在Windows上异步服务请求。。。。?答案似乎是肯定的——毕竟它是一个异步框架 但是,假设我有一个只休眠的端点,即asyncio.sleep(10)并返回。如果我连续快速调用此端点(/)两次,则第一个响应将在10秒内返回,然后才开始处理第二个请求。因此,第二个请求在大约20秒后返回(同步行为) 现在,如果我做了同样的事情,即在两个独立的端点上运行

琐碎的问题,可能被问过几次。 我知道Sanic可以在Windows上运行(即检测到uvloop的缺失,但决不能减少回退和按下)

我的问题是,它是否仍会在Windows上异步服务请求。。。。?答案似乎是肯定的——毕竟它是一个异步框架

但是,假设我有一个只休眠的端点,即asyncio.sleep(10)并返回。如果我连续快速调用此端点(/)两次,则第一个响应将在10秒内返回,然后才开始处理第二个请求。因此,第二个请求在大约20秒后返回(同步行为)

现在,如果我做了同样的事情,即在两个独立的端点上运行一个请求,比如(/i和/)-它们都会在请求到达后立即开始处理,第一个端点需要10秒钟才能响应(如预期的那样),然后第二个端点会在第一个端点之后立即返回(异步行为)

我有点期待请求处理程序的异步IO任务被分配到事件循环中,因此即使在两次调用同一端点时也具有相同的异步行为

我是不是遗漏了什么

从sanic导入sanic
从sanic.response导入json
导入异步
app=Sanic(“X”)
@附件路线(“/”)
异步def测试(请求):
打印(“请求rcvd”)
等待异步睡眠(10)
返回json({“hello”:“world”})
@附件路线(“/i”)
异步def测试(请求):
打印(“请求/i rcvd”)
等待异步睡眠(10)
返回json({“hello”:“i”})
如果名称=“\uuuuu main\uuuuuuuu”:
应用程序运行(主机=“0.0.0.0”,端口=8000)
如果我连续两次调用这个端点(/),第一次 响应在10秒后返回,然后处理 第二个请求开始

我试过你的代码,恐怕无法重现这种行为。对我来说,两个请求都会立即启动,并且都会在10秒后返回结果

为了便于验证,我稍微修改了您的代码并添加了客户端脚本:


server.py

from sanic import Sanic
from sanic.response import json
import asyncio
from datetime import datetime


app = Sanic("X")


@app.route("/")
async def test(request):
    print("request rcvd")
    await asyncio.sleep(10)
    return json({"/": str(datetime.now())})


@app.route("/i")
async def test(request):
    print("request /i rcvd")
    await asyncio.sleep(10)
    return json({"/i": str(datetime.now())})


if __name__ == "__main__":
    app.run(host="127.0.0.1", port=8000)
import asyncio
import aiohttp
from datetime import datetime


async def get(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            return await response.text()


async def main():
    print(f'Started: {datetime.now()}')

    results = await asyncio.gather(
        get('http://127.0.0.1:8000/'),
        get('http://127.0.0.1:8000/'),
    )

    print(f'Finished: {results}')


asyncio.run(main())

client.py

from sanic import Sanic
from sanic.response import json
import asyncio
from datetime import datetime


app = Sanic("X")


@app.route("/")
async def test(request):
    print("request rcvd")
    await asyncio.sleep(10)
    return json({"/": str(datetime.now())})


@app.route("/i")
async def test(request):
    print("request /i rcvd")
    await asyncio.sleep(10)
    return json({"/i": str(datetime.now())})


if __name__ == "__main__":
    app.run(host="127.0.0.1", port=8000)
import asyncio
import aiohttp
from datetime import datetime


async def get(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            return await response.text()


async def main():
    print(f'Started: {datetime.now()}')

    results = await asyncio.gather(
        get('http://127.0.0.1:8000/'),
        get('http://127.0.0.1:8000/'),
    )

    print(f'Finished: {results}')


asyncio.run(main())

结果:

Started: 2020-02-02 16:50:29.087871
Finished: ['{"/":"2020-02-02 16:50:41.137824"}', '{"/":"2020-02-02 16:50:41.137824"}']

当我通过浏览器手动检查所有内容时,我也得到了预期的行为(同一端点上的请求并行启动/完成)