从头造轮子:python3 asyncio之 gather (3) (2)

tasks.py

类/函数 方法 对象 作用 描述
Task       继承自Future,主要用于整个协程运行的周期    
  __init__     初始化对象 self._coro ,并且call_soon将self.__step加入self._ready队列    
    self._coro   用户定义的函数主体    
  __step     Task类的核心函数    
  __wakeup     唤醒任务   新增  
         
ensure_future       如果对象是一个Future对象,就返回,否则就会调用create_task返回,并且加入到_ready队列    

futures.py

类/函数 方法 对象 作用 描述
Future       主要负责与用户函数进行交互    
  __init__     初始化两个重要对象 self._loop 与 self._callbacks    
    self._loop   事件循环    
    self._callbacks   回调队列,任务暂存队列,等待时机成熟(状态不是PENDING),就会进入_ready队列    
  add_done_callback     添加任务回调函数,状态_PENDING,就虎进入_callbacks队列,否则进入_ready队列    
  set_result     获取任务执行结果并存储至_result,将状态置位_FINISH,调用__schedule_callbacks    
  __schedule_callbacks     将回调函数放入_ready,等待执行    
  result     获取返回值    
__await__       使用await就会进入这个方法   新增  
__iter__       使用yield from就会进入这个方法   新增  

3)执行过程

3.1)入口函数

main.py

if __name__ == "__main__": ret = wilsonasyncio.run(helloworld()) print(ret)

ret = wilsonasyncio.run(helloworld())使用run,参数是用户函数helloworld(),进入run,run的流程可以参考上一小节

run --> run_until_complete

3.2)事件循环启动,同之前

3.3)第一次循环run_forever --> run_once

将_ready队列的内容(即:task.__step)取出来执行,这里的coro是helloworld()

def __step(self, exc=None): coro = self._coro try: if exc is None: result = coro.send(None) else: result = coro.throw(exc) except StopIteration as exc: super().set_result(exc.value) else: blocking = getattr(result, '_asyncio_future_blocking', None) if blocking: result._asyncio_future_blocking = False result.add_done_callback(self.__wakeup, result) finally: self = None

__step较之前的代码有改动

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzfgdz.html