Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python aiohttp持久会话的运行时错误_Python_Aiohttp - Fatal编程技术网

Python 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

我刚开始使用aiohttp,遇到了一个我似乎无法解决的问题

我创建了一个持久会话

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
但看到其他问题。