async、await,python协程、线程,代码示例、官方文档示例

import asyncio
import time


# async def say_after(delay, what):
#     """
#     start与hello间隔1秒打印
#     """
#     print("【start】")
#     sleep = asyncio.sleep(delay)
#     task_sleep = asyncio.create_task(sleep)
#     task_print = asyncio.create_task(print_word(what))
#     await task_sleep
#     await task_print
#     # print(what)
#     print("【current_task】", asyncio.current_task())  # 打印1个task:main
#     print("【end】")


async def say_after(delay, what):
    """
    start与hello同时打印
    """
    print("【start】")
    await asyncio.sleep(delay)
    time.sleep(3)
    # 【**】若暂停3秒、观察运行得到:全部需要7秒,
    # 【原因】:
    # 第一个say_after的await asyncio.sleep(1)运行后、控制权马上切换运行第二个say_after的await asyncio.sleep(2),然后2个say_after几乎同时开始等待,
    # 第一个say_after的await中的sleep先休眠结束、重新恢复控制权,继续运行time.sleep(3),阻塞该协程所在的线程;
    # 第一个say_after的time.sleep(3)阻塞完后、第二个say_after的asyncio.sleep(2)已经休眠结束【存疑问】、同时开始第二个的time.sleep(3)阻塞
    # 因此,第一个say_after的asyncio.sleep(1)+time.sleep(3)、与第二个say_after的time.sleep(3),总共是7秒

    # 【遗留疑问】time.sleep(3)开始阻塞时、第二个say_after的asyncio.sleep(2)只休眠了完了第1秒,此时阻塞后、say_after的sleep还能继续休眠完第2秒么?
    # 【A】把第二个say_after从2秒改成5秒,发现总共好事变成8秒,第一个say_after:+asyncio.sleep(1)+time.sleep(3)=4秒,
    # 第二个say_after:+asyncio.sleep(5)+time.sleep(3)=8秒,即第一个say_after的阻塞完后经过4秒、
    # 第二个的异步asyncio.sleep(5)也同时经过了4秒,说明阻塞时、异步的asyncio.sleep()是能同时运行保持休眠的
    print(what)
    print("【current_task】", asyncio.current_task())  # 打印1个task:main
    print("【end】")


async def print_word(what):
    print(what)


# async def main():
#     print(f"started at {time.strftime('%X')}")
#     print("【asyncio.all_tasks() before await】", asyncio.all_tasks())  # 注意:只打印1个task:main
#     await say_after(1, 'hello')  # 【已解决】??? 【**】为什么没有同时一起等待:猜测:没有事先create_task,那么在第一次await后、
#       当前main方法会处于等待状态,因为没有其他的task可以执行;等到这个await的say_after执行结束后,main方法重新获取到控制权、继续执行第二个say_after
#     await say_after(2, 'world')  # 【已解决】??? 为什么没有同时一起等待
#     print("【asyncio.all_tasks() after await】", asyncio.all_tasks())  # 注意:只打印1个task:main
#     print(f"finished at {time.strftime('%X')}")


async def main():
    task1 = asyncio.create_task(
        say_after(1, 'hello'))

    task2 = asyncio.create_task(
        say_after(2, 'world'))

    print(f"started at {time.strftime('%X')}")

    # Wait until both tasks are completed (should take
    # around 2 seconds.)
    print("【current_task in main()】", asyncio.current_task())  # 打印1个task:main
    print("【asyncio.all_tasks()】", asyncio.all_tasks())  # 打印3个task
    # await asyncio.sleep(3)  # 2个都不await的话,sleep3秒,1跟2也会运行完
    await task1
    await task2  # 【注意】只await一个2的话,1、2任务都会运行、hello、world都会打印
    print("【2个await之间】")  # 【注意】先1(1秒)后2、则在中间打印;先2(2秒)后1,、则再2个之后打印
    # await task1  # 【注意】只await一个1的话,只有1任务会打印hello(整个程序运行1秒就结束),2任务没有打印world
    # await task2
    # time.sleep(3) #【注意】2个都不await的话,等待main跑完再跑2个task的start后马上结束
    print("【asyncio.all_tasks() end】", asyncio.all_tasks())  # 打印1个task:main

    print(f"finished at {time.strftime('%X')}")


asyncio.run(main())
async、await,python协程、线程,代码示例、官方文档示例
say_after方法中,
# 【**】若暂停3秒、观察运行得到:全部需要7秒,
# 【原因】:
# 第一个say_after的await asyncio.sleep(1)运行后、控制权马上切换运行第二个say_after的await asyncio.sleep(2),然后2个say_after几乎同时开始等待,
# 第一个say_after的await中的sleep先休眠结束、重新恢复控制权,继续运行time.sleep(3),阻塞该协程所在的线程;
# 第一个say_after的time.sleep(3)阻塞完后、第二个say_after的asyncio.sleep(2)已经休眠结束【存疑问】、同时开始第二个的time.sleep(3)阻塞
# 因此,第一个say_after的asyncio.sleep(1)+time.sleep(3)、与第二个say_after的time.sleep(3),总共是7秒

# 【遗留疑问】time.sleep(3)开始阻塞时、第二个say_after的asyncio.sleep(2)只休眠了完了第1秒,此时阻塞后、say_after的sleep还能继续休眠完第2秒么?
# 【已解决】把第二个say_after从2秒改成5秒,发现总共好事变成8秒,第一个say_after:+asyncio.sleep(1)+time.sleep(3)=4秒,
# 第二个say_after:+asyncio.sleep(5)+time.sleep(3)=8秒,即第一个say_after的阻塞完后经过4秒、
# 第二个的异步asyncio.sleep(5)也同时经过了4秒,说明阻塞时、异步的asyncio.sleep()是能同时运行保持休眠的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值