【python】- 协程函数 asyncio

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:本文主要提到python中异步并发操作,关于Thread多线程同步并发见上文。

Python 中的协程函数也就是我们所说的异步编程,它允许你编写非阻塞的代码,特别适用于 I/O 密集型任务(如网络请求、文件读写等)。首先需要清楚的明白如下概念:

  1. 同步编程
    像我们正常定义的函数就是同步函数,它只能每个函数依次进行,假如某个函数遇到了阻塞,那么整个程序将会被堵塞住,影响执行效率。当然我们可以通过多线程的方式处理,多线程处理的函数也是同步函数,他们将会在同一时刻同步并发
  2. 异步编程
    异步编程也就是我们今天说的协程,它是在一个单一线程里执行的。它的概念是同一个时间段完成多个任务(就像我们人类一样,需要执行吃饭任务,在点完外卖后,不会一直等待外卖,而是这个时间去打一把游戏,等外卖到了,再继续执行吃饭任务,显然这更加的合理。)这就是所谓的异步并发

提示:以下是本篇文章正文内容,仅供学习参考

一、asyncio是什么?

asyncio 是 Python 标准库中的一个模块,用于编写异步 I/O 操作的代码。它基于事件循环(Event Loop)和协程(Coroutine),能够高效地处理 I/O 密集型任务(如网络请求、文件读写等),同时避免阻塞主线程。

二、使用步骤

1.引入库

代码如下(示例):

import asyncio

2. 定义协程函数 async

代码如下(示例):

import asyncio
import time


async def task_1():
    print("send a task1 request...")
    await asyncio.sleep(5)
    print("get responds")
    return "task1"


async def task_2():
    print("send a task2 request...")
    await asyncio.sleep(3)
    print("get responds")
    return "task2"


if __name__ == '__main__':
    t1 = task_1()
    t2 = task_2()
    print(f"t1: {
     t1}, t2: {
     t2}")

async 关键字定义的函数为协程函数,返回一个协程对象,执行结果打印如下,得到的t1t2是协程对象,结果如下

在这里插入图片描述

3. 执行协程函数 await

await 关键字是用来执行协程函数对象的,await暂停执行当前协程直到等待的协程执行完毕,并且让出控制权给事件循环,见示例代码:

import asyncio
import time


async def task_1():
    print("send a task1 request...")
    await asyncio.sleep(2)
    print("get task1 responds")
    return "task1"


async def task_2():
    print("send a task2 request...")
    await asyncio.sleep(3)
    print("get task2 responds")
    return "task2"


def task3():
    print("running task 3")
    time.sleep(3)
    print("end task3")


async def _main():
    ret = await task_1()
    ret = await task_2()
    task3()


if __name__ == '__main__':
    start_ = time.perf_counter()
    asyncio.run(_main())
    end_ = time.perf_counter()
    print(f"total : {
     end_ - start_}")


执行结果如下:

<

Python协程是一种轻量级的多任务并发方法,它可以在单线程中实现并发执行。asyncioPython 3.4版本之后新增的标准库,提供了对异步IO的支持,可以用于编写高效的异步IO应用程序。asyncio中的协程被称为coroutine,使用async关键字定义。 在asyncio中,可以使用async关键字定义协程,使用await关键字来等待协程执行完成。同时,asyncio提供了事件循环(event loop)来管理协程的执行。事件循环是一个类似于死循环的机制,在其中不断地检查协程的状态并执行它们。 下面是一个简单的使用asyncio的例子: ```python import asyncio async def hello(): print("Hello") await asyncio.sleep(1) print("World") loop = asyncio.get_event_loop() loop.run_until_complete(hello()) ``` 在上面的代码中,我们定义了一个协程hello,它先输出“Hello”,然后等待1秒钟,最后输出“World”。我们使用事件循环来执行这个协程asyncio还提供了一些常用的工具函数和类,例如: - asyncio.get_event_loop():获取事件循环对象。 - asyncio.sleep():让协程等待一段时间。 - asyncio.gather():并发执行多个协程- asyncio.ensure_future():将协程加入事件循环。 - asyncio.Queue():实现协程之间的消息传递。 使用asyncio可以方便地编写高效的异步IO应用程序。但需要注意的是,在使用asyncio时,应该尽量避免阻塞操作,因为阻塞操作会阻塞事件循环的执行,影响程序的性能。如果需要进行阻塞操作,可以使用asyncio提供的线程池或进程池来进行处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值