
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() 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 中找到想要的答案...请各位大佬赐教
1 lucays 2022 年 3 月 15 日 你需要并发请求接口,而不是 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() |
2 lucays 2022 年 3 月 15 日 额,v2 回复后缩进没了,你自己处理下上面代码的缩进吧 |
3 raycool 2022 年 3 月 15 日 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) |
4 ClericPy 2022 年 3 月 15 日 客户端代码呢... |
5 anxiousPumpkin OP @lucays 我明白了,刚才自测是用浏览器多 tab 模拟多请求,所以导致了串行,postman 、curl 包括你这个代是可行的。十分感谢 |
6 anxiousPumpkin OP |