当前位置: 首页 > 知识库问答 >
问题:

对没有sleep()的代码使用async有意义吗?

焦阎宝
2023-03-14

我读过很多不同的文章,解释Python中的async。但是他们都用asyncio.sleep(x)给出了一个例子,就像这样:

import asyncio

async def test1 ():
    await asyncio.sleep(1)
    print(1)

async def test2 ():
    print(2)

async def main ():
    await asyncio.gather(test1(), test2())

asyncio.run(main()) #prints 2, then 1

在这种情况下,我很清楚:函数test1中的wait表示,在asyncio.sleep的执行过程中,我们可以执行其他操作,例如执行函数test2。

我不明白的是,如果我在代码中不使用睡眠,异步怎么会有用?在这种情况下,我如何同时运行函数?例如,如何在下面的示例中同时运行函数test1和test2?

import asyncio
import time

async def calculate (a):
    return a**a

async def test1 ():
    x = await calculate(1111111)
    print('done!')

async def test2 ():
    for i in range(100):
        print('.', end='')

async def main ():
    await asyncio.gather(test1(), test2())

asyncio.run(main()) #prints 'done!' before the dots

共有1个答案

商曦
2023-03-14

您可以通过任务来实现这一点。

任务用于并发调度协程。

如果将协同程序包装到具有类似于asyncio.create_Task()(请参阅官方文档)的功能的任务中,则会自动安排协同程序很快运行:

import asyncio
import time


async def calculate(a):
    return a**a


async def test1():
    # Schedule calculate(a) to run soon concurrently
    # with "main()".
    task = asyncio.create_task(calculate(11111))

    # "task" can now be used to cancel "calculate(a)", or
    # can simply be awaited to wait until it is complete:
    await task
    print('done!')


async def dots_printer():
    for i in range(100):
        print('.', end='')
        

async def test2():
    # Schedule dots_printer() to run soon concurrently
    # with "main()".
    task = asyncio.create_task(dots_printer())

    # "task" can now be used to cancel "dots_printer()", or
    # can simply be awaited to wait until it is complete:
    await task


async def main():
    await asyncio.gather(test1(), test2())


asyncio.run(main()) #prints the dots before 'done!'
 类似资料:
  • 问题内容: 我想知道,由于Clojure Compiler和UglifyJS不仅针对大小优化代码,而且还针对性能进行优化(尽管我认为大小是主要的优先事项),如果将我的node.js应用程序缩小了,它将运行得更快吗?我知道这可能取决于应用程序,但我通常会问这个问题。 问题答案: 在节点中,主要处理成本是I / O操作,而不是实际的JavaScript本身。因此,例如: 在这里,调用与被触发的回调之间

  • 我正在学习JAVA OCA认证书。我在二元运算符一章。这本书提到了以下规则。 、和在使用二进制运算符时将提升为int。 因此,目前,如果我定义并初始化一个short或byte类型的变量,它将自动转换为int。在书中,它说赋值是一个二进制运算符。 使用这些变量有什么意义吗? 如何在java中打印这种类型的变量?

  • 我写了下面的代码来登录网站“qtpselenium.com”。 如果我将Thread.Sleep放在中间,使代码执行暂停一段时间,下面的代码就可以正常工作。如果我对thread.sleep进行注释,代码就不能按预期工作。我尝试使用selenium的隐式和显式等待来使驱动程序等待元素可见,但代码只能在使用Thread.Sleep时按预期工作。 有没有什么方法可以使下面的代码在不使用thraed.sl

  • 在“旋转”和时查找里程之和并将里程之和聚合时,我缺少了什么?是否是值导致了错误?我认为对于聚合不是一个问题。

  • 有什么富有诗意的新年祝福代码含义

  • 我找不到在VS代码中对齐/识别代码行的快捷方式。 一个例子 我想要捷径做什么