浅谈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中线程threading.Thread的使用详解

    Python中线程(threading.Thread)是实现并发操作的重要手段之一,通过线程可以实现多个任务同时进行,提高程序的效率。下面,我将为大家详细讲解如何使用Python中的线程(threading.Thread)。 基本用法 Python中的线程通过threading.Thread()方法来创建,该方法接收两个参数target和args,其中tar…

    python 2023年5月19日
    00
  • python调用文件时找不到相对路径的解决方案

    当使用Python中的相对路径调用文件时,有时会遇到文件找不到的问题,这是由于Python的工作目录与文件所在目录不同导致的。下面是两种解决方案,分别是使用绝对路径和修改工作目录。 方案一:使用绝对路径 使用绝对路径可以避免文件找不到的问题,因为使用绝对路径可以直接指定文件的具体路径。可以使用os模块中的os.path.abspath(path)函数获得文件…

    python 2023年6月3日
    00
  • python实现定时任务的八种方式总结

    Python实现定时任务的八种方式总结 在Python开发中,经常需要实现定时任务的功能。这篇文章将会介绍Python实现定时任务的八种方式。 1. 使用time.sleep()函数 使用time.sleep()函数实现定时任务的方式是最简单的。该函数会暂停程序的执行一段时间,可根据需要设置阻塞的时间。 import time while True: pri…

    python 2023年5月19日
    00
  • Python实现读取json文件到excel表

    接下来我会详细讲解如何用Python实现读取json文件到excel表的完整实例教程,并提供两条示例说明。 1. 准备工作 首先需要掌握以下Python模块: json: 能够处理json格式数据的模块。 pandas: 能够将数据转化为Excel格式并进行导出的模块。 需要注意的是,需要先安装以上两个模块,可以通过pip或其他方法进行安装。 2. 读取js…

    python 2023年5月14日
    00
  • Python实现打包成库供别的模块调用

    Python 是一门非常流行的高级编程语言, 其中一个主要的优点就是能够编写模块来减少重复的代码。在实际应用中,我们通常需要将多个模块组合成一个库并方便其他程序使用。接下来,我将为大家详细讲解 Python 中如何将若干个模块打包成一个库,以便其他模块调用。 1. 创建项目并编写模块 首先,我们需要创建一个项目,并且在项目中编写模块。对于该项目, 我们可以使…

    python 2023年6月6日
    00
  • numpy.random.seed()的使用实例解析

    numpy.random.seed()的使用实例解析 numpy.random.seed()的作用 numpy.random.seed() 用于指定随机数生成器的种子,以确保在生成随机序列时得到可重复的结果。 语法格式 numpy.random.seed(seed=None) 其中,参数 seed 表示要设置的随机种子值,默认值为 None。 示例一 下面是…

    python 2023年6月3日
    00
  • 详解Python如何轻松实现定时执行任务

    下面详细讲解如何使用Python轻松实现定时执行任务: 1. 背景介绍 在某些场景下,我们需要对某些任务进行定时执行,比如每天定时备份数据库、每周定时清理垃圾文件等等。Python提供了丰富的库和工具,使得我们可以很容易地实现这些功能。 2. 实现步骤 下面我们介绍一下如何使用Python实现定时执行任务的步骤。 2.1 安装定时模块 在Python中,有一…

    python 2023年5月18日
    00
  • 学习Python selenium自动化网页抓取器

    学习Python Selenium自动化网页抓取器是一项非常重要的技能,可以大大提高爬虫开发的效率。下面是一份完整的攻略,供大家参考: 学习Python Selenium自动化网页抓取器 步骤一:安装Selenium和浏览器驱动 Selenium是Python的一个自动化测试框架,它可以模拟浏览器行为实现自动化操作,包括网页抓取。首先需要安装Selenium…

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