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()是能同时运行保持休眠的