浅谈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中的进程、线程、协程

    Python中的进程、线程、协程 在Python中,进程、线程和协程都是用来实现多任务处理的。多任务处理指同时执行多个任务。 进程 进程是操作系统资源分配的最小单位。进程具有独立的内存空间,每个进程有自己的代码段、数据段和堆栈。进程通过操作系统的接口进行通信和协调,进程之间的切换是由操作系统进行管理和调度。 Python提供了multiprocessing模…

    python 2023年5月19日
    00
  • 通俗讲解python 装饰器

    当我们需要给已经存在的函数添加一些额外的功能,但是又不想修改已有函数的功能时,Python中的装饰器就是一个非常适合的工具。装饰器是一种返回函数的函数,它可以接受一个函数作为参数并返回一个新的函数来增强参数函数的功能。装饰器提供了一种方便的方式来修改函数,而不需要对原始函数的代码进行修改。 什么是装饰器 装饰器本质上是一个 Python 函数或类,可以使其他…

    python 2023年5月18日
    00
  • Python使用requests提交HTTP表单的方法

    以下是关于Python使用requests提交HTTP表单的方法: Python使用requests提交HTTP表单的方法 requests是Python中一个流行的HTTP库,可以用于向Web服务器发送HTTP请求和接响应。以下是Python使用requests提交HTTP表单的方法: 发送GET请求 以下是使用requests发送GET请求的示例: im…

    python 2023年5月14日
    00
  • 详解Python从一个元组中获取第一个和最后一个元素

    获取元组(tuple)中的第一个和最后一个元素可以使用Python内置的索引(index)功能。 获取第一个元素:可以使用[0]索引,因为在Python中,序列都是从0开始计数的。 获取最后一个元素:可以使用[-1]索引,因为负数索引代表倒数第n个元素。 例如,在以下元组中,我们可以使用索引获取第一个和最后一个元素: days_of_week = (‘Mon…

    python-answer 2023年3月25日
    00
  • Selenium 使用 Python – Geckodriver 可执行文件需要在 PATH 中

    【问题标题】:Selenium using Python – Geckodriver executable needs to be in PATHSelenium 使用 Python – Geckodriver 可执行文件需要在 PATH 中 【发布时间】:2023-04-03 01:30:01 【问题描述】: 我是编程新手,大约两个月前开始使用 Pytho…

    Python开发 2023年4月8日
    00
  • python+playwright微软自动化工具的使用

    一、介绍Python+Playwright是一个基于Python语言的自动化测试工具,支持多种浏览器,包括Chrome、Firefox和Safari等。它使用了微软的自动化工具Playwright,提供了一种方便、快捷的测试解决方案。在使用前需要安装Python和Playwright库。 二、安装Python和Playwright1. 安装Python 打开…

    python 2023年5月19日
    00
  • Python 实用技巧之正则表达式查找和替换文本的操作方法

    Python实用技巧之正则表达式查找和替换文本的操作方法 正则表达式是一种强大的工具,可以用于查找和替换文本中的模式。Python中的re模块提供了正则表达式的支持,本攻略将详细讲解如何使用re模块进行文本的查找和替换操作。 re模块基本用法 在使用re模块之前,需要先导入该模块: import re re模块提供了一些常用的函数,用于处理正则表达式: re…

    python 2023年5月14日
    00
  • Python之csv文件从MySQL数据库导入导出的方法

    下面详细讲解Python如何操作csv文件实现MySQL数据库的导入导出。 1. csv文件的导出(从MySQL数据库到csv文件) 步骤1:导出数据到csv文件 使用Python的标准库中的csv和pymysql模块,可以快速地从MySQL数据库中导出数据到csv文件。下面是示例代码: import csv import pymysql # 连接MySQL…

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