Python aiohttp持久会话的运行时错误
我刚开始使用aiohttp,遇到了一个我似乎无法解决的问题 我创建了一个持久会话Python aiohttp持久会话的运行时错误,python,aiohttp,Python,Aiohttp,我刚开始使用aiohttp,遇到了一个我似乎无法解决的问题 我创建了一个持久会话 session=aiohttp.ClientSession(headers=headers) 当我调用run()时,我的程序会崩溃,并进行以下回溯 RuntimeError: Timeout context manager should be used inside a task 我没有得到任何回溯,当我不使用持久会话时,func可以正常执行。也就是说,当我定义fetch如下时,run按预期执行 async de
session=aiohttp.ClientSession(headers=headers)
当我调用run()
时,我的程序会崩溃,并进行以下回溯
RuntimeError: Timeout context manager should be used inside a task
我没有得到任何回溯,当我不使用持久会话时,func可以正常执行。也就是说,当我定义fetch
如下时,run
按预期执行
async def fetch(url):
async with aiohttp.ClientSession(headers=headers) as see:
async with session.get(url) as resp:
return await resp.json()
您需要将
session=…ClientSession
移动到内部fetch
,创建会话时最好使用async with
差不多
async def fetch(url):
async with aiohttp.ClientSession(headers=headers) as session:
async with session.get(url) as resp:
return await resp.json()
async def run():
task = asyncio.create_task(fetch('https://someurl'))
await task
更新了更完整的示例:
class Foboar():
def __init__(self):
self.session = None
async def run(self):
self.session = aiohttp.ClientSession(headers=headers)
try:
for url in all_my_urls:
await self.fetch(url)
finally:
await self.session.close()
async def fetch(self, url):
async with self.session.get(url) as resp:
return await resp.json()
您需要将
session=…ClientSession
移动到内部fetch
,创建会话时最好使用async with
差不多
async def fetch(url):
async with aiohttp.ClientSession(headers=headers) as session:
async with session.get(url) as resp:
return await resp.json()
async def run():
task = asyncio.create_task(fetch('https://someurl'))
await task
更新了更完整的示例:
class Foboar():
def __init__(self):
self.session = None
async def run(self):
self.session = aiohttp.ClientSession(headers=headers)
try:
for url in all_my_urls:
await self.fetch(url)
finally:
await self.session.close()
async def fetch(self, url):
async with self.session.get(url) as resp:
return await resp.json()
def run
不是async
,因此不能在其中使用wait
。可能帖子的格式不对?是的,我在发帖时省略了async
关键字。我已经对我的原始帖子进行了编辑。def run
不是async
,因此不能在其中使用wait
。可能帖子的格式不对?是的,我在发帖时省略了async
关键字。我已经对我的原始帖子进行了编辑。这很有效,但我最终为我提出的每个请求创建了一个新的会话。如何保持会话以供重用,而不是每次调用fetch
yes时都创建一个新会话,因此在run
中创建会话并将其传递给每个fetch
调用。请看主要示例。根据,会话上下文管理器不是必需的,这正是我正在做的。此外,无论何时调用run
,您建议的方法仍然会创建一个新会话。我想在HttpClient初始化时,为每个站点创建一个会话
,就像初始化self.session=aiohttp.ClientSession()
一样。对不起,我很匆忙,更新了一个更完整的示例,实现了self.session
。它与我最初的问题有何不同?调用run
后,self.session
将绑定到aiohttp.ClientSession
的一个实例,在调用run
之前,我将session
绑定到aiohttp.ClientSession
。我能够让代码正常工作的唯一方法是,如果我通过了timeout=None
,但看到了其他问题。这是可行的,但我最终为我提出的每个请求创建了一个新会话。如何保持会话以供重用,而不是每次调用fetch
yes时都创建一个新会话,因此在run
中创建会话并将其传递给每个fetch
调用。请看主要示例。根据,会话上下文管理器不是必需的,这正是我正在做的。此外,无论何时调用run
,您建议的方法仍然会创建一个新会话。我想在HttpClient初始化时,为每个站点创建一个会话
,就像初始化self.session=aiohttp.ClientSession()
一样。对不起,我很匆忙,更新了一个更完整的示例,实现了self.session
。它与我最初的问题有何不同?调用run
后,self.session
将绑定到aiohttp.ClientSession
的一个实例,在调用run
之前,我将session
绑定到aiohttp.ClientSession
。我能够让代码正常工作的唯一方法是通过timeout=None
但看到其他问题。