首页 > 其他分享 >协程与asyncio

协程与asyncio

时间:2023-02-27 16:57:01浏览次数:34  
标签:协程 await func print main asyncio

1.协程

协程不是计算机提供的,程序员人为创造的

用户态的上下文切换技术

2.asyncio

在python3.4及之后的版本支持

2.1事件循环

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

#伪代码
任务列表 = [ 任务1, 任务2, 任务3 ...]
while True:
    可执行的任务列表,已完成的任务列表 = 去任务列表中检查所有的任务,将可执行和已完成的任务安徽
    for 就绪任务 in 可执行的任务猎豹
        执行就绪任务
    for 已完成的任务 in 已完成的任务列表
        在任务列表中移除 已完成的任务
    如果 任务列表 中的任务都已完成,则终止循环

 

2.2快速上手

协程函数,定义函数的时候async def 函数名

协程对象,执行协程函数得到的协程对象

async def func():
    pass

result = func()

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

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

def func():
    print("协程!!!!!")

result = func()


#loop = asyncio.get_event_loop()
# 时间循环执行
#loop.run_until_complete(result) #python3.7之后支持 asyncio.run(result)

3.3 await

await + 可等待的对象{协程对象 Future对象 Task对象 -------->IO等待}

示例1:

import asyncio

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

asyncio.run(func())

结果:

执行协程函数内部代码
start
end
IO请求结果1,结果为: 返回值

示例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("执行协程函数内部代码")
    # 遇到IO操作挂起当前协程(任务),等IO操作完成之后在继续往下执行,当协程挂起时,事件循环可以去执行其他协程(任务)
    response1 = await others()
    print("IO请求结果,结果为:", response1)

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

asyncio.run(func())

结果:

执行协程函数内部代码
start
end
IO请求结果1,结果为: 返回值
start
end
IO请求结果2,结果为: 返回值

 

await就是等待对象的值得到结果之后再继续向下走,将协程对象变成task对象,获取返回值

3.4Task对象

在时间循环中添加多个任务

通过asyncio.create_task(协程对象)的方式创建Task对象,这样可以让协程加入时间循环中等待被调度执行,除了使用asyncio.create_task(协程对象)函数外,还可以使用低层级的loop.create_task()或ensure_future()函数

注意:asyncio.create_task 函数是在python3.7中被加入,在python3.7前可以改用asyncio.ensure_future 函数

import asyncio

async def func():
    print(1)
    await asyncio.sleep(2)
    print(2)
    return "返回值"

async def main():
    print("main开始")

    #创建task对象,将当前执行func函数任务添加到事件循环中
    task1 = asyncio.create_task(func())

    task2 = asyncio.create_task(func())

    print("main结束")

    # 当执行某协程遇到IO操作时,会自动切换执行其他任务,
    # 此处的await时等待相对应的协程全部执行完毕并获取结果
    ret1 = await task1
    ret2 = await task2
    print(ret1,ret2)

if __name__ == '__main__':
    asyncio.run(main())

结果:

main开始
main结束
1
1
2
2
返回值 返回值

示例2:

 

import asyncio


async def func():
    print(1)
    await asyncio.sleep(2)
    print(2)
    return "返回值"


async def main():
    print("main开始")

    # 创建task对象,将当前执行func函数任务添加到事件循环中
    task_list = [asyncio.create_task(func()), asyncio.create_task(func())]

    print("main结束")

    done, pending = await asyncio.wait(task_list, timeout=None)
    print(done)
    print(pending)



if __name__ == '__main__':
    asyncio.run(main())

结果:

main开始
main结束
1
1
2
2
{<Task finished name='Task-2' coro=<func() done, defined at C:\Users\dingwei\PycharmProjects\fastapi\test.py:4> result='返回值'>, <Task finished name='Task-3' coro=<func() done, defined at C:\Users\dingwei\PycharmProjects\fastapi\test.py:4> result='返回值'>}
set()

 

标签:协程,await,func,print,main,asyncio
From: https://www.cnblogs.com/huaweidog/p/17151438.html

相关文章

  • [Unity/C#]委托+协程,依次启动多播委托里协程的方法
    1//委托的定义2publicdelegateIEnumeratorActiveDuringTurn(Player[]otherplayers);34publiceventActiveDuringTurnUEvent;567//依次启动协程......
  • Python 异步: 等待有时间限制的协程(12)
    我们可以使用asyncio.wait_for()函数等待asyncio任务或协程超时完成。如果在任务完成之前超时已过,任务将被取消。1.什么是Asynciowait_for()asyncio.wait_for()......
  • python 协程
    协程Python中的协程和生成器很相似但又稍有不同。主要区别在于: 生成器是数据的生产者 协程则是数据的消费者首先我们先来回顾下生成器的创建过程。我们可以这样去创建......
  • Go语言并发编程:对进程、线程、协程和并发、并行的理解
    Go语言并发编程:进程、线程、协程和并发、并行的理解一、进程和线程对操作系统进程和线程以及协程的了解,可以看看我前面的文章:对进程、线程和协程的理解以及它们的区别......
  • 一文了解Python协程本质
    关于Python协程我觉得当你学到一定程度的时候一定要懂,比如你在对代码进行优化或者提升速度时,就不得不使用异步编程,加上现在有很多的优秀第三方库都可以实现异步编程,从而让......
  • Python 异步: 同时运行多个协程(10)
    asyncio的一个好处是我们可以同时运行许多协程。这些协同程序可以在一个组中创建并存储,然后同时一起执行。这可以使用asyncio.gather()函数来实现。让我们仔细看看。1......
  • 协程
    一、协程概念协程又称微线程(纤程),是一种用户态的轻量级线程子程序在所有的语言中都是层级调用的,比如A中调用B,B在执行过程中调用C,C执行完返回,B执行完返回,最后是A......
  • 协程
    引入:无论多线程还是多进程其实没有解决一个性能相关的问题,IO阻塞,无论是多进程还是多线程,在遇到IO阻塞时都会被操作系统强行剥夺走CPU的执行权限(使得cup执行其他操作,其他......
  • 第三篇:协程
    协程的介绍"""进程:资源单位线程:执行单位协程:单线程下实现并发(这个概念完全是由程序员意淫出来的,根本不存在)程序员在代码层面上检测所有的IO操作,一旦遇到IO,将在代......
  • 4.协程模块
    协程:用户态的线程,相当于线程中的线程,更轻量级。后续配置sockethook,可以把复杂的异步调用,封装成同步操作。降低业务逻辑的编写复杂度。目前该协程是基于ucontext_t来实现......