浅谈Python协程asyncio

yizhihongxing

浅谈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 – Pandas 组合了两个提供不同值的数据框

    【问题标题】:Python – Pandas combine two dataframes that provide different valuesPython – Pandas 组合了两个提供不同值的数据框 【发布时间】:2023-04-01 03:45:02 【问题描述】: 我有两个不同的数据框,有两列,我想合并它们 + 得到它们 B 列的总和。问题是…

    Python开发 2023年4月8日
    00
  • 如何在Python中插入数据到MongoDB数据库?

    以下是如何在Python中插入数据到MongoDB数据库的完整使用攻略,包括安装PyMongo库、连接MongoDB数据库、插入数据等步骤。同时,提供了两个示例以便更好理解如何在中插入数据到MongoDB数据库。 步骤1:安装PyMongo库 在Python中,我们可以使用pip命令安装Py库。以下是装PyMongo库的基本语法: pip install p…

    python 2023年5月12日
    00
  • 读写json中文ASCII乱码问题的解决方法

    以下是“读写json中文ASCII乱码问题的解决方法”的完整攻略: 问题 在读写json文件时,如果处理中文时会遇到中文字符被自动转换成ASCII码而出现乱码的情况。 原因 这是由于不同的编码格式所导致的。在处理中文字符时,一般会用到UTF-8编码格式,而JSON默认使用的是Unicode编码格式。在进行转换时,如果没有正确设置编码格式,就可能会出现ASCI…

    python 2023年5月20日
    00
  • python实现SMTP邮件发送功能

    下面是一份简单的“Python实现SMTP邮件发送功能”的攻略。 SMTP是什么? SMTP(Simple Mail Transfer Protocol)是一种用于发送电子邮件的协议。该协议定义了某些规则,以确保邮件的可靠传递。Python的smtplib库提供了SMTP客户端实现。 邮件发送环境配置 在进行SMTP邮件发送之前,需要确保已配置SMTP服务器…

    python 2023年6月3日
    00
  • python下解压缩zip文件并删除文件的实例

    首先,我们需要在Python中使用zipfile模块解压缩zip文件,并在解压缩后删除压缩文件。下面是实现此目的的完整攻略。 第一步:导入模块 在Python中使用zipfile模块解压缩文件,需要先导入该模块。使用下面的代码导入zipfile模块: import zipfile 第二步:定义解压缩函数 接下来,我们需要定义一个解压缩函数,用于解压缩zip文…

    python 2023年6月3日
    00
  • 暂停/恢复嵌入式 python 解释器

    【问题标题】:Pause/Resume embedded python interpreter暂停/恢复嵌入式 python 解释器 【发布时间】:2023-04-05 21:56:01 【问题描述】: 是否有可能在我需要的地方暂停/恢复嵌入式 python 解释器的工作?例如: C++伪代码部分: main() { script = “python_scr…

    Python开发 2023年4月6日
    00
  • python和c语言哪个更适合初学者

    这是一个非常常见的问题。Python和C语言,都是编程语言中的重要代表,但它们的设计和特点却完全不同。作为初学者,应该选择哪一门语言呢?以下是一些事实和判断依据,帮助初学者分辨自己的需求与兴趣,以做出合适的学习选择。 Python: 简单易学,适合初学者 Python是一种脚本语言,设计原则是强调代码的可读性和简洁性。因此,Python的语法相对简单,易于理…

    python 2023年6月6日
    00
  • python中实现栈的三种方法

    下面我将为你详细讲解“python中实现栈的三种方法”的完整攻略,包含以下三种实现方式: 使用列表模拟栈(List) 使用队列模拟栈(Queue) 使用链表模拟栈(Linked List) 1.使用列表模拟栈(List) 列表(List)是Python中最基本的数据结构之一,可以用来实现栈的数据结构。在列表中,我们可以使用 append() 方法将元素压入栈…

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