协程总结
总结:
asyncio只需要单线程就能实现并发,每个线程中只能有一个事件循环,事件循环使用协作式调度(cooperative scheduling),一次只运行一个Task(如果你在其它线程中也启动了事件循环,则可以并行运行多个Task)。当它启动后,会依次从任务队列获取Task并执行它- 每个
Task会自动执行协程的下一步,即发送result = coro.send(None) - 如果
协程通过await或yield from调用了其它协程,则当前协程被暂停(suspend)并进行协程的上下文切换(保存当前协程的 variables、state 等,然后导入其它协程的上下文) - 如果其它
协程中也使用了await或yield from调用了其它协程,则重复步骤 3,直到某个协程(比如asyncio.sleep())中调用了await future或yield from future,则执行Future对象的__await__或__iter__方法,通过yield self直接返回Future对象本身给Task中的result,并把控制权交还给事件循环。Task会向事件循环注册事件: 当Future对象完成时,请执行我的__wakeup()方法唤醒我 事件循环重复步骤 1,继续调度执行其它任务- 当某个
Future对象(代表耗时的异步操作,如网络 I/O)运行完成后,会被设置结果。同时,事件循环会唤醒对应的Task继续运行,又发送result = coro.send(None)让协程链上的各个协程依次恢复执行(resume)。此时,Future对象会将它的结果作为返回值通过StopIteration异常发送给等待它的协程,协程链上的各个协程依次返回值(可能会再处理),最终Task会获取经过各协程处理后的数据,并设置为它的结果,至此,该Task运行结束
浙公网安备 33010602011771号