栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Python中最简单的异步/等待示例

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python中最简单的异步/等待示例

为了回答您的问题,我将为同一问题提供3种不同的解决方案。

情况1: 普通的python

import timedef sleep():    print(f'Time: {time.time() - start:.2f}')    time.sleep(1)def sum(name, numbers):    total = 0    for number in numbers:        print(f'Task {name}: Computing {total}+{number}')        sleep()        total += number    print(f'Task {name}: Sum = {total}n')start = time.time()tasks = [    sum("A", [1, 2]),    sum("B", [1, 2, 3]),]end = time.time()print(f'Time: {end-start:.2f} sec')

输出:

Task A: Computing 0+1Time: 0.00Task A: Computing 1+2Time: 1.00Task A: Sum = 3Task B: Computing 0+1Time: 2.01Task B: Computing 1+2Time: 3.01Task B: Computing 3+3Time: 4.01Task B: Sum = 6Time: 5.02 sec

情况2: 异步/等待做错了

import asyncioimport timeasync def sleep():    print(f'Time: {time.time() - start:.2f}')    time.sleep(1)async def sum(name, numbers):    total = 0    for number in numbers:        print(f'Task {name}: Computing {total}+{number}')        await sleep()        total += number    print(f'Task {name}: Sum = {total}n')start = time.time()loop = asyncio.get_event_loop()tasks = [    loop.create_task(sum("A", [1, 2])),    loop.create_task(sum("B", [1, 2, 3])),]loop.run_until_complete(asyncio.wait(tasks))loop.close()end = time.time()print(f'Time: {end-start:.2f} sec')

输出:

Task A: Computing 0+1Time: 0.00Task A: Computing 1+2Time: 1.00Task A: Sum = 3Task B: Computing 0+1Time: 2.01Task B: Computing 1+2Time: 3.01Task B: Computing 3+3Time: 4.01Task B: Sum = 6Time: 5.01 sec

情况3: 异步/等待正确完成 (与情况2相同,除了

sleep
功能不同)

import asyncioimport timeasync def sleep():    print(f'Time: {time.time() - start:.2f}')    await asyncio.sleep(1)async def sum(name, numbers):    total = 0    for number in numbers:        print(f'Task {name}: Computing {total}+{number}')        await sleep()        total += number    print(f'Task {name}: Sum = {total}n')start = time.time()loop = asyncio.get_event_loop()tasks = [    loop.create_task(sum("A", [1, 2])),    loop.create_task(sum("B", [1, 2, 3])),]loop.run_until_complete(asyncio.wait(tasks))loop.close()end = time.time()print(f'Time: {end-start:.2f} sec')

输出:

Task A: Computing 0+1Time: 0.00Task B: Computing 0+1Time: 0.00Task A: Computing 1+2Time: 1.00Task B: Computing 1+2Time: 1.00Task A: Sum = 3Task B: Computing 3+3Time: 2.00Task B: Sum = 6Time: 3.01 sec

case 1
case 2
给相同
5 seconds
,而
case 3
公正
3 seconds
。因此,
async/await doneright
速度更快。

差异的原因在于

sleep
功能的实现内。

# case 1def sleep():    print(f'Time: {time.time() - start:.2f}')    time.sleep(1)# case 2async def sleep():    print(f'Time: {time.time() - start:.2f}')    time.sleep(1)# case 3async def sleep():    print(f'Time: {time.time() - start:.2f}')    await asyncio.sleep(1)

sleep
case 1
case 2
中是“相同”的。他们“睡觉”而不允许其他人使用资源。而
case 3
允许在睡眠状态下访问资源。

case 2
我们添加
async
到正常功能。但是,事件循环将在 不中断的情况下
运行它。为什么?因为我们没有说允许循环在哪里中断您的函数以运行另一个任务。

case 3
我们告诉事件循环中,确切地中断了该函数的位置以运行另一个任务。到底在哪里?

# case 3async def sleep():    print(f'Time: {time.time() - start:.2f}')    await asyncio.sleep(1) # <-- Right here!

更多关于此阅读这里

更新02 / May / 2020

考虑阅读

  • 异步编程旅行者指南
  • Asyncio期货和协程


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/495289.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号