- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想创建一个持续到程序结束的持久 session ,我有以下代码。
import asyncio
import aiohttp
import atexit
class Session:
def __init__(self):
self._session = aiohttp.ClientSession()
atexit.register(self._close_session)
async def get(self, url):
response = await self._session.request("GET", url)
return await response.json()
def _close_session(self):
asyncio.run(self._session.close())
async def pullit():
print(await session.get("https://raw.communitydragon.org/latest/game/data/characters/aatrox/aatrox.bin.json"))
session = Session()
asyncio.run(pullit()) # THIS THROWS: Timeout context manager should be used inside a task
asyncio.get_event_loop().run_until_complete(pullit()) #THIS RUNS OK
这在 self._session.request
行上引发了一个异常,Timeout context manager should be used inside a task
,我已经搜索了其他答案,但它仍然给出同样的错误。
问题:这个错误的原因是什么?如果我想打开一个持续程序生命周期的 session ,并且我需要在类中定义它(强制性),那会怎样?
额外: 目前我正在使用 atexit
在程序结束时关闭 session (引用上面的代码),这是一个好的方式吗这样做?如果不是,什么是更好的做法
更新:我找到了解决方案,它是使用 asyncio.get_event_loop().run_until_complete(...)
,但不是 asyncio.run()
和上面一样吗?为什么一个运行没有问题而 3.7+ asyncio.run()
不运行?
更新 2:我得到了以下代码:
#runner.py
import aiohttp
import asyncio
class Runner:
def __init__(self, coro):
self.coro = coro
async def run(self):
session = aiohttp.ClientSession()
client.start_session(session)
await self.coro
client.close_session()
await session.close()
def run(coro):
runner = Runner(coro)
return asyncio.run(runner.run())
#client.py
class Client:
def __init__(self):
self._session = None
async def get(self, url):
response = await self._session.request("GET", url)
return await response.json()
def start_session(self, session):
self._session = session
def close_session(self):
self._session = None
from .runner import run
from .client import Client
client = Client()
async def pullit():
print(await client.get("https://raw.communitydragon.org/latest/game/data/characters/aatrox/aatrox.bin.json"))
run(pullit())
好的,这一切都运行了,但在它运行之后它抛出了我RuntimeError: Event loop is closed
,我从来没有关闭过一个循环。
最佳答案
这是我对你的问题的解决方案:
import aiohttp
import asyncio
import atexit
class HTTPClient():
def __init__(self):
self._session = aiohttp.ClientSession()
atexit.register(self._shutdown)
print('session created')
async def request(self, *args, **kwargs):
async with self._session.request(*args, **kwargs) as response:
return (response.status, await response.text())
def _shutdown(self):
asyncio.run(self._session.close())
print('session closed')
async def main():
http_client = HTTPClient()
status, text = await http_client.request(url='http://example.com', method='GET')
print(status)
asyncio.run(main())
另一方面,我想,最好的方法应该是对以下代码进行一些包装:
async with aiohttp.ClientSession() as session:
# perform all needed http calls inside
pass
关于python - 在类 __init__ 上定义 aiohttp ClientSession 以供以后重用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63471158/
我想要一个类似于 django runserver 所做的重新加载。 如果我更改 python 文件,我希望应用程序重新加载。我已经安装了 aiohttp-devtools 并使用 adev runs
我在使用 RouteTableDef 时遇到问题。 有一些项目的路由结构如下: 1) 有文件route.py。 路线.py from aiohttp import web routes = web.R
我有一些代码对某些 API 进行请求序列。我想为所有人设置通用日志记录,我该如何设置? 假设我的代码是这样的 import aiohttp import asyncio async def fetch
您能否就以下方面提出建议? 在 localhost:8900 上有 aiohttp 服务器在运行 当我从 python 发出类似(使用 python2 模块请求)的请求时 requests.get("
每当我对使用 asyncio 和 aiohttp 访问的 API 执行超过 200 个请求时,我都会收到 aiohttp client_exception.ServerDisconnectedErro
在我正在开发的爬虫中。它使用 pycurl multi 发出请求。 如果我改用aiohttp,我可以期待什么样的效率提升? 怀疑让我怀疑潜在的改进,因为 python 有 GIL。大部分时间都花在等待
我在尝试使用 azure 测试聊天机器人时遇到一些问题: 我使用 github actions 在 azure web 应用程序上部署了我的机器人,一切都很顺利。但是当我尝试测试我的聊天机器人时,没有
我在尝试使用 azure 测试聊天机器人时遇到一些问题: 我使用 github actions 在 azure web 应用程序上部署了我的机器人,一切都很顺利。但是当我尝试测试我的聊天机器人时,没有
我想知道如何从 aiohttp post 方法获取当前的上传步骤。通常我会使用 get 方法在循环中拉取当前步骤,但如果主机不响应当前上传步骤,这将不起作用。那么有可能得到当前步骤吗?诸如“从 xx%
我目前正在用 aiohttp 做我的第一个“婴儿学步” (来自 requests 模块)。 我尝试稍微简化请求,这样我就不必在主模块中为每个请求使用上下文管理器。 因此我尝试了这个: async de
tl;dr:如何最大化可以并行发送的 http 请求数量? 我正在使用 aiohttp 库从多个网址获取数据。我正在测试它的性能,并且观察到该过程中的某个地方存在瓶颈,一次运行更多的网址并没有帮助。
目前我正在执行以下操作来获取当前正在运行的应用程序 async def handler(request): app = request.app 是否有其他方法来获取当前正在运行的应用程序?考虑
首先是代码: import random import asyncio from aiohttp import ClientSession import csv headers =[] def ext
我的 aiohttp 中间件获取函数作为参数,而不是已传递给路由的绑定(bind)方法。如何解释这种行为?如何避免这种情况? class AsyncHttpServer: def __init
我正在尝试在 aiohttp 处理程序中启动后台长时间任务: from aiohttp import web import time import asyncio async def one(requ
我正在测试 aiohttp 和 asyncio。我希望相同的事件循环具有套接字、http 服务器、http 客户端。 我正在使用此示例代码: @routes.get('/') async def he
#!/usr/bin/env python3.5 import asyncio import aiohttp url = "http://eniig.dk" async def main():
考虑以下代码: from aiohttp_mako import template def authorize(): def wrapper(func): @asyncio.c
我正在编写一个网络爬虫,它为许多不同的域运行并行提取。我想限制每秒向每个单独的域发出的请求数,但我不关心打开的连接总数或每秒的总请求数跨越所有领域。 我想最大限度地提高打开的连接数和每秒请求数,同时限
我需要将 sub_app 添加到 sub_app。这是我的代码 app = web.Application() subapp = web.Application() subapp.router.add
我是一名优秀的程序员,十分优秀!