Skip to content

协程,asyncio和异步编程

【【2022 Python异步编程】协程 & asycio & 异步】https://www.bilibili.com/video/BV1rY411f7GG?p=2&vd_source=02b9c3bad55a6d6dfebfa953558df337

第一部分:协程 第二部分:asyncio模块进行异步编程 第三部分:实战案例

2. 携程意义

在一个线程中如果遇到IO等待时间,线程不会傻傻等待,利用空闲时间的时候再去干其他的事

3. 异步编程

3.1 事件循环

理解成一个死循环,去检测并执行某些代码

# 去生成或获取一个事件循环
loop = asyncio.get_event_loop()  
# 将任务放到任务列表
loop.run_until_complete(asyncio.wait(tasks))

3.2 快速上手

携程函数,定义函数时 async def 函数名

携程对象,执行 携程函数() 得到的对象

async def func()
    pass
result = func()
注意:执行携程函数创办携程对象,函数内部代码不会执行

如果要运行携程函数内部代码,必须要将携程对象交给事件循环来处理。

import asyncio

async def func()
    pass
result = func()
#loop = asyncio.get_event_loop()  
#loop.run_until_complete(result)
asyncio.run(result)

3.3 await

await+ 可等待的对象(协程对象,Future、Task对象--> IO等待)

await 就是等待对象的值得到结果之后再往下走

示例1 :

import asyncio

async def fuc():
    print("来玩呀")
    response= await asyncio.sleep(2)
    print("结束",response)

asyncio.run(func())

示例2:

import asyncio

async def others():
    print("start")
    await asyncio.sleep(2)
    print("end")
    return "返回值"

async def func():
    print("执行协程函数内部代码")
    # 遇到IO操作挂起当前协程(任务),等待IO操作完成之后再继续往下执行。当前协程挂起时,事件循环可以去执行其他协程(任务)。
    response =await others()
    print("IO 请求结束,结果为:",response)

asyncio.run(func())

示例3

import asyncio

async def others():
    print("start")
    await asyncio.sleep(2)
    print("end")
    return "返回值"

async def func():
    print("执行协程函数内部代码")
    response =await others()
    print("IO 请求结束,结果为:",response)
    response2 =await others()
    print("IO请求结束,结果为:",response2)

asyncio.run(func())

3.4 Task 对象

白话:在事件循环中添加多个任务