【问题标题】:asyncio TaskGroup throwing TypeError when returning listsasyncio TaskGroup 在返回列表时抛出 TypeError
【发布时间】:2023-02-21 22:55:29
【问题描述】:

我正在尝试使用 Python 3.11 中的新 TaskGroup 对象来返回列表,但我正在努力寻找正确的语法。这个新功能还没有太多示例代码,所以我想我会问。

import asyncio

async def squares(nums):
    return await [n**2 for n in nums]

async def squares_tasks(nums1, nums2):
    async with asyncio.TaskGroup as tg:
        squares1 = tg.create_task(squares(nums1))
        squares2 = tg.create_task(squares(nums2))
        return squares1, squares2

nums1, nums2 = [1, 2, 3], [4, 5, 6]
squares1, squares2 = asyncio.run(squares_tasks(nums1, nums2))

这会引发以下错误: TypeError: 'type' object does not support the context manager protocol

对于我做错了什么,我将不胜感激,谢谢。

【问题讨论】:

    标签: python async-await python-asyncio python-3.11


    【解决方案1】:

    您的程序中有多个错误。这是一个正确的:

    import asyncio
    
    
    async def squares(nums):
        return [n**2 for n in nums]
    
    
    async def squares_tasks(nums1, nums2):
        async with asyncio.TaskGroup() as tg:
            squares1 = tg.create_task(squares(nums1))
            squares2 = tg.create_task(squares(nums2))
    
        r1 = squares1.result()
        r2 = squares2.result()
    
        return r1, r2
    
    
    if __name__ == "__main__":
        nums1, nums2 = [1, 2, 3], [4, 5, 6]
        squares1, squares2 = asyncio.run(squares_tasks(nums1, nums2))
        print(squares1, squares2)
    

    首先,您必须等待任务完成,即您必须使用squares1squares2外部异步语句。其次,您必须使用.result()方法来获取任务的实际结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-21
      • 1970-01-01
      • 2021-09-25
      • 2023-03-25
      • 2021-08-19
      • 1970-01-01
      • 2013-11-03
      相关资源
      最近更新 更多