Python Asyncio完成后立即显示每个任务结果的结果

Python Asyncio完成后立即显示每个任务结果的结果,python,python-3.x,Python,Python 3.x,目前我使用asyncio.wait(*tasks)完成所有任务,然后显示每个任务的结果。尽管如此,我还是想在具体任务完成后展示每个任务的结果。有这样的选择吗?我看到两种解决方案 直接在任务中显示它——但这可能对您不感兴趣 分配回调函数,该函数将在任务完成时执行 task.add_done_callback(show_result) 最小工作示例 import asyncio import random def show_result(task): ""&q

目前我使用
asyncio.wait(*tasks)
完成所有任务,然后显示每个任务的结果。尽管如此,我还是想在具体任务完成后展示每个任务的结果。有这样的选择吗?

我看到两种解决方案

  • 直接在
    任务中显示它
    ——但这可能对您不感兴趣

  • 分配
    回调
    函数,该函数将在
    任务
    完成时执行

    task.add_done_callback(show_result)
    

  • 最小工作示例

    import asyncio
    import random
    
    
    def show_result(task):
        """callback"""
        number, time = task.result()
        print(f'callback: number: {number} time: {time}')
        
    
    async def task(number, time):
        print(f'start : number: {number} time: {time}')
        await asyncio.sleep(time)
        print(f'end   : number: {number} time: {time}')
        return number,time
    
    
    async def main():
        # random times for sleep
    
        times = list(range(1, 6))
        random.shuffle(times)
        
        # create tasks with callbacks
    
        tasks = []
        
        for number, time in enumerate(times):
            t = asyncio.create_task(task(number, time))
            t.add_done_callback(show_result)
            tasks.append(t)
    
        print('--- during wait ---')
            
        await asyncio.wait(tasks)
        
        print('--- after wait ---')
        
        # display results also after all tasks
        for t in tasks:
            #print('result:', t.result())
            show_result(t)
            
    asyncio.run(main())
    
    结果:

    --- during wait ---
    start : number: 0 time: 5
    start : number: 1 time: 4
    start : number: 2 time: 2
    start : number: 3 time: 3
    start : number: 4 time: 1
    end   : number: 4 time: 1
    callback: number: 4 time: 1
    end   : number: 2 time: 2
    callback: number: 2 time: 2
    end   : number: 3 time: 3
    callback: number: 3 time: 3
    end   : number: 1 time: 4
    callback: number: 1 time: 4
    end   : number: 0 time: 5
    callback: number: 0 time: 5
    --- after wait ---
    callback: number: 0 time: 5
    callback: number: 1 time: 4
    callback: number: 2 time: 2
    callback: number: 3 time: 3
    callback: number: 4 time: 1
    

    你现在如何“展示”结果?您是否正在使用
    print(wait asyncio.wait(*tasks)
    ?对于您想要的用法,除了“显示”每个结果之外,您是否还想获得一个结果列表?某些任务可能会得到任务结束后执行的
    回调
    ,并且您可以使用将显示结果的函数名。