前端摸索后端小白,请教各位一个服务端的问题,关于 Python sanic 用法

2022-03-15 22:49:02 +08:00
 anxiousPumpkin
import asyncio

from sanic import Sanic
from sanic.response import json

app = Sanic(__name__)


@app.route("/")
async def test(request):
    print('func invoke!')
    await asyncio.sleep(3)
    return json({"hello": "world"})


if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8000, workers=2)

我想请教下关于 sanic 处理接口并发请求。 比如上述我的test接口函数,该方法处理逻辑直到返回需要 3s ,此时同时有 5 次请求进入。

我期望的结果是同时输出 5 次func invoke!,然后依次返回 response 。 但是目前情况是队列效果,进入函数输出func invoke!,3s 后返回 response ,紧接着输出下一个func invoke!

觉得是服务端很基础的问题,但是实在是没有在 google 中找到想要的答案...请各位大佬赐教

2122 次点击
所在节点    Python
6 条回复
lucays
2022-03-15 23:03:08 +08:00
你需要并发请求接口,而不是 for 循环请求。

例如:

from concurrent.futures import ThreadPoolExecutor, as_completed

import requests


def request(url):
r = requests.get(url)
print(r.text)


url = 'http://127.0.0.1:8000'
with ThreadPoolExecutor(8) as e:
tasks = [e.submit(request, url) for i in range(8)]
for task in as_completed(tasks):
task.result()
lucays
2022-03-15 23:05:25 +08:00
额,v2 回复后缩进没了,你自己处理下上面代码的缩进吧
raycool
2022-03-15 23:10:05 +08:00
from sanic.response import json

app = Sanic(__name__)

async def task():
print('func invoke!')


@app.route("/")
async def test(request):
loop = request.app.loop
loop.create_task(task())
await asyncio.sleep(5)
return json({'hello': 'world'})

if __name__ == "__main__":
app.run(host="0.0.0.0", port=8000, workers=2)
ClericPy
2022-03-15 23:12:23 +08:00
客户端代码呢...
anxiousPumpkin
2022-03-15 23:28:01 +08:00
@lucays 我明白了,刚才自测是用浏览器多 tab 模拟多请求,所以导致了串行,postman 、curl 包括你这个代码是可行的。十分感谢
anxiousPumpkin
2022-03-15 23:28:58 +08:00
@ClericPy @raycool 感谢回复,明白问题了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/840618

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX