import asyncio
from datetime import datetime
async def func(n, semaphore):
print(f"time: {datetime.now().strftime('%H:%M:%S')} func {n} enter") ### 第5行
k = n+1
for i in range(k*100): _ = [[] for _ in range(k*10)]
# ----------------------------------------------------------------------------------
await semaphore.acquire() #第7行
print(f"time: {datetime.now().strftime('%H:%M:%S')} func {n} start {semaphore._value}") #第8行
await asyncio.sleep(k) #第9行
print(f"time: {datetime.now().strftime('%H:%M:%S')} func {n} Semaphore(value={semaphore._value}, locked={semaphore.locked()})")
semaphore.release() #第11行
# ----------------------------------------------------------------------------------
# 横线里的这段代码等价于
# async with semaphore:
# print(f"time: {datetime.now().strftime('%H:%M:%S')} func {n} start")
# await asyncio.sleep(2)
# print(f"time: {datetime.now().strftime('%H:%M:%S')} func {n} Semaphore(value={semaphore._value}, locked={semaphore.locked()})")
print(f"time: {datetime.now().strftime('%H:%M:%S')} func {n} end") #第18行
return n
async def main():
semaphore = asyncio.Semaphore(3)
tasks = [asyncio.create_task(func(i, semaphore)) for i in range(6)]
complete = await asyncio.gather(*tasks)
for i in complete:
print("当前数字: ", i)
await main() ### In jupyter
#asyncio.run(main()) ##In plain Python (≥3.7)
代码和图片就讲了一个故事,当用单线程异步,当创建了60个任务后,最大异步锁为3,前3个任务在依次遇到IO操作则阻塞执行下一个任务非IO操作,而在所有非阻塞执行完后,等待原IO的异步阻塞完成,当完成一个则异步锁释放,则获得异步锁的任务执行IO操作。 如图3完成一个启动一个,图1完成3个启动3个,但是如果同时完成2个IO阻塞并释放异步锁时,是先启动还是先执行非阻塞代码( # 第18行)?显然是先接着执行阻塞后的非阻塞代码,启动是受事件循环切换的,而CPU执行完阻塞任务在没有遇到await时是会继续执行后面的代码滴。