【发布时间】:2019-07-10 17:55:08
【问题描述】:
我试图了解将 aiohttp 与 Sanic 一起使用的正确方法是什么。
从 aiohttp documentation,我发现以下内容:
不要为每个请求创建会话。您很可能需要每个应用程序一个会话来完全执行所有请求。 更复杂的情况可能需要每个站点一个会话,例如一个用于 Github,另一个用于 Facebook API。无论如何,为每个请求创建一个会话是一个非常糟糕的主意。 会话内部包含一个连接池。连接重用和保持活动(默认情况下都打开)可以提高整体性能。
当我去 Sanic 文档时,我发现了一个这样的例子:
这是一个例子:
from sanic import Sanic
from sanic.response import json
import asyncio
import aiohttp
app = Sanic(__name__)
sem = None
@app.route("/")
async def test(request):
"""
Download and serve example JSON
"""
url = "https://api.github.com/repos/channelcat/sanic"
async with aiohttp.ClientSession() as session:
async with sem, session.get(url) as response:
return await response.json()
app.run(host="0.0.0.0", port=8000, workers=2)
这不是管理 aiohttp 会话的正确方法...
那么正确的方法是什么?
我应该在应用程序中初始化会话并将会话注入所有层中的所有方法吗?
我发现的唯一问题是 this 但这无济于事,因为我需要创建自己的类来使用会话,而不是 sanic。
在 Sanic 文档中还发现了 this,它说您不应该在事件循环之外创建会话。
我有点困惑:( 正确的方法是什么?
【问题讨论】:
-
嘿@Tomer,我想知道,你觉得任何答案有帮助吗?
-
@johnMoutafis 谢谢!我们实际上做了类似的事情,只是做了一些小的改动。首先,自 2.0 版以来,ClientSession 中的传递循环已被弃用,因此我们不这样做。此外,我们没有使用“全局”定义全局会话,而是将其放在应用程序上。另外不要忘记在应用关闭时您需要关闭 ClientSession。
-
@johnMoutafis,如果你同意我的观点,如果你能改变你的答案,我会很高兴,这样我就可以点击“接受答案”:)
-
我做了一些研究,因为你告诉我的很有趣,我更新了我的答案:D
-
@johnMoutafis 谢谢:) 同时更新描述。 (你不再使用全局)
标签: python python-3.x asynchronous aiohttp sanic