协程asyncio随意

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时是会继续执行后面的代码滴。

  • 15
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值