有勇气的牛排博客
☰

协程、asyncio、异步编程

有勇气的牛排 1126 Python 2023-05-18 20:59:45

知止自律打卡-微信小程序APP
一款微信自律打卡小程序,支持自定义打卡项目、习惯记录、项目日记、专注计时与数据统计。自律打卡、学习打卡、读书打卡、健身打卡、运动打卡、减肥打卡、戒色打卡、养生打卡、戒烟、戒酒、戒熬夜等多种场景。万能打卡模板自由创建。可自定义每日打卡目标,记录习惯连续天数,可视化追踪成长进度。
了解产品详情 →
微信搜索「知止自律打卡」
知止自律打卡微信小程序

@TOC

1 协程

协程不是由操作系统提供,由程序员人为提供(用户态上下文切换技术)

协称(Coroutine),也可以被称为微线程,是一种用户态内的上下文切换技术。简而言之,其实就是通过一个线程实现代码块相互切换执行。

实现协程的几种方法:

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

2 异步编程

3.1 事件循环

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

import asyncio

# 生成或获取一个事件循环
loop = asyncio.get_event_loop()

# 将任务放到 任务列表
loop.run_until_complete(任务)

3.2 async

协程函数:定义函数的时候async def 函数名
协程对象:执行协程函数()得到协程对象

# 协程对象
async def func():
	pass	# 内容不执行

# 协程对象
result = func()

注意:执行协程函数创建爱协程对象,函数内部代码不会执行

事件循环处理函数内部代码

import asyncio

# 协程对象
async def func():
	pass	# 内容不执行

# 协程对象
result = func()

# 添加事件,帮助执行函数内部代码 py3.4
#loop = asyncio.get_event_loop()
#loop.run_until_complete(result)

# py3.7
asycio.run(result)

3.3 await

await + 可等待对象(协程对象、Future、Task)

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

案例一:

import asyncio

async def func():
    print("666")
    # 这里等待2秒,有其他任务执行其他任务,然后继续向后执行
    res = await asyncio.sleep(2)
    print("结束", res)

asyncio.run(func())

案例二:

import asyncio

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

async def func():
    print("执行协程函数内部代码")

    # 遇到IO操作挂起当前协程(任务),等IO操作完成之后再继续往下执行。
    # 当前协程挂起时,事件循环可以去执行其他协程(任务)
    res = await others()
    print("IO请求结束,结果为:", res)
    
asyncio.run(func())

案例三

import asyncio


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


async def func():
    print("执行协程函数内部代码")

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

    res2 = await others()
    print("IO请求结束,结果为:", res2)

asyncio.run(func())

3.4 Task对象

参考地址:
https://www.bilibili.com/video/BV1dD4y127bD

标签:

×
×