2021-08-25 py协程

本文深入探讨了Python asyncio中协程的调度机制,从获取事件循环到协程的创建、执行、挂起与恢复。通过示例代码详细分析了在asyncio中,如何通过Task类和回调函数实现协程的切换和恢复,以及协程调度与Redis事件循环的相似之处。文章旨在帮助读者更好地理解协程的工作原理。
摘要由CSDN通过智能技术生成
# 代码片段1
#一个协程执行流程被打断的最主要的原因就是在协程内部调用了另一个协程函数
import asyncio
import asyncio.coroutines

def _set_result_unless_cancelled(fut, result):
    if fut.cancelled():
        return
    print("this is a rewrited sleep callback function")
    fut.set_result(result)

# asyncio.sleep()函数的实现版本
@asyncio.coroutine
def dalong_sleep(delay, result=None, *, loop=None):
    """Coroutine that completes after a given time (in seconds)."""
    #如果delay=0, 直接yield
    if delay == 0:
        yield
        return result

    future = loop.create_future()
    h = future._loop.call_later(delay,
                                _set_result_unless_cancelled,
                                future, result)
    try:
        # 遇到yield from,则当前协程的执行流程被打断
        return (yield from future)
    finally:
        h.cancel()

async def cor1():
    # 遇到await,当前协程执行流程被打断,当前Task的唤醒函数被设置为dalong_sleep的Task的
    # 的回调函数
    await
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值