【问题标题】:How does work varibles with tasks in asyncio?工作变量如何与 asyncio 中的任务一起使用?
【发布时间】:2021-10-24 01:02:39
【问题描述】:

在学习asyncio的过程中,我犯了一个错误,链接到变量“task1”3次。

import asyncio
import time

async def say_after(delay, what):
    await asyncio.sleep(delay)
    print(what)

async def main():
    print(f"start at {time.strftime('%X')}")
    task1 = asyncio.create_task(say_after(1, 'a'))
    task1 = asyncio.create_task(say_after(2, 'aba'))
    task1 = asyncio.create_task(say_after(3, 'faf'))

    await task1
    #await task2
    print(f"finished at {time.strftime('%X')}")

asyncio.run(main())

但是当我运行代码时,我得到了这个输出

start at 19:05:19

a

aba

faf

finished at 19:05:22

为什么它不只打印最后创建的任务? 为什么第一个和第二个任务没有清除?

在清晰的python中,如果我这样写:

page = 0
page = 1
page = 2

print(page)

我会得到“2”,因为之前指向对象的链接将从内存中删除。

为什么不一样?它是如何工作的?

【问题讨论】:

    标签: python-asyncio


    【解决方案1】:

    您正在启动三个任务并等待三个任务中最慢的一个完成。

    await task1 没有运行任务,它正在等待分配给task1 的第三个任务对象完成。其他两个任务仍然存在于事件循环中并且仍在运行,它们首先完成,因为它们更快。

    查看此问题的另一种方法是稍微修改您的代码。这将按照您的预期开始,然后抛出错误,因为程序在较慢的任务之前完成。

        task1 = asyncio.create_task(say_after(3, 'a'))     # make slowest
        task1 = asyncio.create_task(say_after(2, 'aba'))
        task1 = asyncio.create_task(say_after(1, 'faf'))   # make fastest
    

    重写您的代码是完全删除task1=,以明确await task1 更多地与等待任务完成有关,而与使其运行无关。

        asyncio.create_task(say_after(1, 'a'))
        asyncio.create_task(say_after(2, 'aba'))
        asyncio.create_task(say_after(3, 'faf'))
    
        while len(asyncio.all_tasks()) > 1:
            await asyncio.sleep(0.1)
        # await task1
    

    更常用的方法是收集对所有任务的引用并等待任务列表完成。

        tasks = []
        tasks.append(asyncio.create_task(say_after(3, 'a')))
        tasks.append(asyncio.create_task(say_after(2, 'aba')))
        tasks.append(asyncio.create_task(say_after(1, 'faf')))
    
        await asyncio.gather(*tasks)
    

    【讨论】:

      猜你喜欢
      • 2021-02-24
      • 1970-01-01
      • 1970-01-01
      • 2022-01-24
      • 1970-01-01
      • 2021-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多