什么是协程

协程(co-routine,又称微线程、纤程)是一种多方协同的工作方式。协程不是进程或线程,其执行过程类似于 Python 函数调用,Python 的 asyncio 模块实现的异步IO编程框架中,协程是对使用 async 关键字定义的异步函数的调用。当前执行者在某个时刻主动让出(yield)控制流,并记住自身当前的状态,以便在控制流返回时能从上次让出的位置恢复(resume)执行

 

协程与线程的区别

1) 一个线程可以多个协程,一个进程也可以单独拥有多个协程。

2) 线程进程都是同步机制,而协程则是异步。

3) 协程能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态。

4)线程是抢占式,而协程是非抢占式的,所以需要用户自己释放使用权来切换到其他协程,因此同一时间其实只有一个协程拥有运行权,相当于单线程的能力。

5)协程并不是取代线程, 而且抽象于线程之上, 线程是被分割的CPU资源, 协程是组织好的代码流程, 协程需要线程来承载运行, 线程是协程的资源, 但协程不会直接使用线程, 协程直接利用的是执行器(Interceptor), 执行器可以关联任意线程或线程池, 可以使当前线程, UI线程, 或新建新程.。

6)线程是协程的资源。协程通过Interceptor来间接使用线程这个资源。

# coding:utf-8
import asyncio
import time

async def say_after(delay, what):
    await asyncio.sleep(delay) #阻塞 delay 指定的秒数
    print(what)

async def main():
    
    #asyncio.create_task() 函数用来并发运行作为 asyncio 任务 的多个协程
    # task1 = asyncio.create_task(say_after(5, 'hello'))
    # task2 = asyncio.create_task(say_after(5, 'world'))

    print(f"started at {time.strftime('%X')}")
    # await task1
    # await task2
    await say_after(5, 'hello')
    await say_after(5, 'world')
    print(f"finished at {time.strftime('%X')}")

asyncio.run(main())

 

started at 10:02:52
hello
world
finished at 10:03:02

 

 posted on 2023-06-27 10:10  boye169  阅读(60)  评论(0)    收藏  举报