浅谈Python协程asyncio

浅谈Python协程asyncio

什么是协程

协程是一种用户态的轻量级线程,它比线程更加的轻量级,占用系统资源更少,利用协程可以写出异步非阻塞的代码。Python中的协程是通过生成器实现的。

什么是asyncio

Python标准库中提供了asyncio模块用于支持异步io操作,asyncio实现了事件循环(Event Loop),协程和任务(Task)三个抽象概念。事件循环是异步IO的核心,协程是任务的执行单元,任务则是使用协程定义的,由事件循环调度执行。

asyncio采用了单线程的方式进行开发,保证了在同一时刻只有一个协程在执行,这也避免了并发访问共享数据时的线程安全问题。

以下是一个简单的协程示例,通过async和await关键字可以实现异步非阻塞调用:

import asyncio

async def task():
    print("Task running...")
    await asyncio.sleep(1)
    print("Task done!")

async def main():
    task1 = asyncio.create_task(task())
    task2 = asyncio.create_task(task())
    await task1
    await task2

asyncio.run(main())

在上面的示例中,task()函数是一个协程函数,使用async关键字定义。异步操作可以通过使用await关键字来实现,await asyncio.sleep(1)表示让当前的任务等待1秒。在main()函数中,使用asyncio.create_task()来创建两个协程任务,然后通过await等待任务执行结束。

asyncio中的常用工具

asyncio.gather()

asyncio.gather()方法可以同时运行多个协程任务,并且在所有任务结束后进行汇总。下面是一个使用asyncio.gather()的示例:

import asyncio

async def task1():
    print("Task1 running...")
    await asyncio.sleep(1)
    print("Task1 done!")
    return "Task1 result"

async def task2():
    print("Task2 running...")
    await asyncio.sleep(2)
    print("Task2 done!")
    return "Task2 result"

async def main():
    results = await asyncio.gather(task1(), task2())
    print(results)

asyncio.run(main())

在上面的示例中,task1()task2()是两个协程任务。asyncio.gather(task1(), task2())会同时运行这两个任务,等待它们执行完成之后进行汇总,输出的结果为:

Task1 running...
Task2 running...
Task1 done!
Task2 done!
['Task1 result', 'Task2 result']

asyncio.wait()

asyncio.wait()方法可以在多个协程任务运行时,等待其中一个任务完成后再继续运行其他任务。下面是一个使用asyncio.wait()的示例:

import asyncio

async def task1():
    print("Task1 running...")
    await asyncio.sleep(1)
    print("Task1 done!")
    return "Task1 result"

async def task2():
    print("Task2 running...")
    await asyncio.sleep(2)
    print("Task2 done!")
    return "Task2 result"

async def main():
    tasks = [task1(), task2()]
    done, pending = await asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED)
    print(done.pop().result())
    print(pending)

asyncio.run(main())

在上面的示例中,task1()task2()是两个协程任务。使用tasks = [task1(), task2()]定义任务列表,然后使用asyncio.wait()方法异步运行所有任务,return_when=asyncio.FIRST_COMPLETED表示在任意一个任务完成时就返回,这里是等待第一个任务完成。done是已完成的任务列表,pending是未完成的任务列表。输出的结果为:

Task1 running...
Task2 running...
Task1 done!
Task1 result
{<Task pending coro=<task2() running at test.py:10>>}

总结

Python的asyncio提供了一种非阻塞异步编程方式,能够提高程序的并发性和性能表现。通过使用协程,可以让代码更具可读性和维护性。同时,asyncio提供了一些常用工具函数,如asyncio.gather()asyncio.wait(),可以在协程任务中灵活运用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈Python协程asyncio - Python技术站

(0)
上一篇 2023年6月5日
下一篇 2023年6月5日

相关文章

  • Python新手入门webpy小应用开发

    下面详细讲解一下“Python新手入门webpy小应用开发”的完整攻略。 环境准备 首先,我们需要安装Python环境。在安装完成Python之后,我们可以通过pip安装web.py框架。使用以下命令安装: pip install web.py 基本概念 web.py框架是一个轻量级的Python web框架。它提供了一些基本的工具和功能来帮助我们快速开发w…

    python 2023年5月30日
    00
  • Python命令行解析器argparse详解

    Python命令行解析器argparse详解 1. 简介 在开发Python命令行工具时,可以使用标准库中的argparse模块来解析命令行参数。argparse模块可以帮您更容易地处理复杂的命令行参数,例如选项(–verbose)、参数(file.txt)和子命令(checkout、commit等)。 2. 安装 argparse是Python标准库的一…

    python 2023年6月3日
    00
  • Python 正则表达式爬虫使用案例解析

    Python正则表达式爬虫使用案例解析 正则表达式是一种强大的文本处理工具,可以用来匹配、查找、替换、分割等。在Python中,我们可以使用正则表达式来处理文本。本文将介绍Python正则表达式爬虫使用案例解析,包括提取网页中的图片链接和电子邮件地址。 提取网页中的图片链接 在爬虫开发中,我们经常需要提取网页中的图片链接。下面是一个例子,演示如何使用正则表达…

    python 2023年5月14日
    00
  • 详解python编译器和解释器的区别

    详解Python编译器和解释器的区别 在学习Python过程中,你一定会经常听到编译器和解释器这两个概念。虽然它们都可以用来编译和执行Python程序,但它们之间有一些重要的区别。 Python编译器 Python编译器是一种工具,它将Python代码转换为另一种格式,称为字节码。这种字节码是机器可读的,但不是原始机器代码。Python解释器可以读取这些字节…

    python 2023年6月5日
    00
  • Python爬虫:Request Payload和Form Data的简单区别说明

    Python 爬虫:Request Payload 和 Form Data 的简单区别说明 在使用 Python 进行爬虫时,我们经常需要发送 POST 请求,并传递一些参数。这些参数可以通过 Request Payload 或 Form Data 的方式传递。以下是 Request Payload 和 Form Data 的简单区别说明。 Request …

    python 2023年5月15日
    00
  • pycharm部署django项目到云服务器的详细流程

    下面是“pycharm部署django项目到云服务器的详细流程”的完整攻略: 准备工作 云服务器:你需要一个云服务器,具体可以选择阿里云、腾讯云等云服务商。并且在云服务器上开启相应的端口,例如80端口,用于访问网页。 pycharm:推荐使用最新版的pycharm实现部署。 django项目:已经开发完成的django项目,并且可以在本地没有问题地运行。 部…

    python 2023年5月13日
    00
  • 用python 制作图片转pdf工具

    下面是使用 Python 制作图片转 PDF 工具的完整攻略: 步骤一:安装必要的Python库 在使用 Python 制作图片转 PDF 工具前,需要安装必要的 Python 库。可以通过 pip 命令安装,例如: pip install pillow pip install img2pdf 其中,pillow 库用于图片处理,img2pdf 库用于将图片…

    python 2023年6月5日
    00
  • Python实现疫情地图可视化

    以下是Python实现疫情地图可视化的完整攻略: 疫情地图可视化的介绍 疫情地图可视化是一种通过地图展现疫情数据的方式,它能够直观地表现病例分布情况,帮助人们更好地了解疫情发展的情况和趋势。 攻略步骤 步骤一:数据收集 要实现疫情地图可视化,首先需要采集相关的数据。可以通过网上搜索或者各大数据统计平台获取数据,比如国家卫健委发布的疫情通报和各地卫健委的官方网…

    python 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部