首页 > 编程语言 >在Python中如何使用协程进行并发操作

在Python中如何使用协程进行并发操作

时间:2024-03-28 18:00:13浏览次数:19  
标签:协程 Python await 并发 async asyncio

在Python中使用协程进行并发操作是一种高效的方式来处理I/O密集型任务或者在单个Python程序内部执行多个操作。本文将详细介绍如何在Python中使用协程进行并发操作,包括协程的基本概念、如何创建和运行协程、如何使用任务来管理多个协程,以及如何利用协程进行并发网络请求等。最后,我们将总结协程的关键点。

协程的基本概念

协程是一种轻量级的线程,但与线程不同的是,协程的切换和调度完全由程序员手动控制,而非操作系统。这意味着在执行过程中,当协程遇到IO操作时,可以暂停执行当前协程,转而执行其他协程,直到IO操作完成。这种方式可以有效利用CPU资源,提高程序的并发性能。

Python从3.5版本开始引入了asyncawait关键字,使得协程的写法更加简洁和直观。

创建和运行协程

在Python中,协程通过定义一个使用async关键字的函数来创建。使用await关键字可以挂起协程的执行,等待另一个协程完成。

import asyncio

async def main():
    print('Hello')
    await asyncio.sleep(1)
    print('world')

asyncio.run(main())

使用任务管理多个协程

当你有多个协程需要并发执行时,可以使用asyncio.create_task来创建任务。任务是对协程的进一步封装,使得协程的管理更加灵活。

async def say_after(delay, what):
    await asyncio.sleep(delay)
    print(what)

async def main():
    task1 = asyncio.create_task(say_after(1, 'hello'))
    task2 = asyncio.create_task(say_after(2, 'world'))

    print('started at', time.strftime('%X'))

    # 等待两个任务都完成
    await task1
    await task2

    print('finished at', time.strftime('%X'))

asyncio.run(main())

利用协程进行并发网络请求

并发网络请求是协程非常典型的应用场景。利用协程,可以在等待网络响应的同时执行其他任务,从而显著提高程序的执行效率。

import aiohttp
import asyncio

async def fetch(session, url):
    async with session.get(url) as response:
        return await response.text()

async def main():
    async with aiohttp.ClientSession() as session:
        html = await fetch(session, 'http://python.org')
        print(html[:100])

asyncio.run(main())

总结

Python的协程提供了一种非常强大的并发编程模型。通过使用asyncawait关键字,开发者可以方便地编写协程代码,实现高效的并发操作。利用任务来管理多个协程,可以进一步提高代码的执行效率和可管理性。此外,通过并发网络请求的示例,我们看到了协程在处理I/O密集型任务时的巨大优势。总体而言,掌握Python中的协程不仅可以提高程序的性能,还能为解决复杂的并发问题提供更多的可能性。

标签:协程,Python,await,并发,async,asyncio
From: https://blog.csdn.net/Oliver9987/article/details/137119775

相关文章

  • 想学Python必看!!让你的Python学习之路事半功倍!!(超详细)
    前言在学习编程的路上,许多小伙伴脑子一热毫无规划就开始自学,结果不出一周,就从入门到入土,小编为大家整理了一份入门须知,看完事半功倍!本篇通过以下四块展开,提供大量资源对应。选一个好版本有没有看过《在下坂本,有何贵干?》那个版本可以装B,Python的版本则是你的工作环境。......
  • Python 字符串转为字典的两种常用方式(接口交互时)
    结论:在做接口时,请求、响应信息,必须要用json格式 原因:常规的字符串转为字典有两种方式,但两种方式都存在一定的问题:1、ast.literal_eval()(包含eval等类型方法)问题1:安全性,(literal_eval安全性好一些,eval不安全)问题2:需要将字符串中的 true false  null  =》 True......
  • python执行shell命令并输出日志
    使用npminstall时,由于npminstall控制台输出的构建信息是加载条,之前用的python脚本不能输出,且加载条完之后的输出也不能获取。因为需要使用新的脚本,使用下面的脚本python执行npminstall可以输出加载条之后的日志。process.poll()为返回码,正确运行返回码为0,若不为0则退出系统。w......
  • 想成为一名Python web开发工程师,你需要具备什么技能?
    前言在大家的印象中,Python被广泛的应用在人工智能、自动化运维、自动化测试、机器学习等方向,并且有着不可或缺的作用;但其实Python的应用领域不止这些,Python还可以进行后台开发,正因如此市场上有了Pythonweb开发的岗位需求。那么想要从事Pythonweb开发,需要掌握哪些技能呢?......
  • python之类8.1
    一、介绍类类(class):用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例实例化:创建一个类的实例,类的具体对象。对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法方法:类中定义的函数类变......
  • python-json数据、pyecharts的入门使用(折线图)
    目录1. json数据格式 1.1 json.dumps()1.2 json.loads()2. pyecharts的入门使用(折线图)2.1  pyecharts使用的简单示例2.1.1 导包2.1.2 创建对象2.1.3 添加x轴数据2.1.4 添加y轴数据2.1.5 设置全局配置项2.1.6 render()方法,生成图像3. ......
  • Flask python 开发篇:模型(model)Flask-SQLAlchemy的使用
    Flask-SQLAlchemy实现模型一、为什么使用模型?二、Flask-SQLAlchemy的引入三、使用Flask-SQLAlchemy构建模型文件3.1、安装扩展3.2、配置3.3、实战使用3.4、与蓝图相结合使用一、为什么使用模型?上一篇分享了蓝图的使用,也说蓝图相当于了php中控制器+路由的使用,那根......
  • [oeasy]python0012_程序写错了怎么办
    运行python文件_报错处理_NameError......
  • [Python]-基础-1.环境部署
    [Python]基础——环境部署&知识补充一、环境部署1.1软件下载1.1.1版本选择内置函数是Python自带的函数,不同版本的Python,其内置函数在数量和使用上大不相同,尤其是Python2和Python3大版本之间的迭代,教程全程采用Python3.8.3进行代码演示,为了避免版本兼容冲突,希望......
  • Python Flask-Mail实现邮件发送
    使用falsk-mail发送邮件一、邮件发送的扩展二、根据文档,总结发送邮件的流程三、实现邮件发送功能3.1、安装扩展3.2、配置3.3、发送邮件(创建mail、message实例并发送)3.4、发送带附件的邮件3.5、批量发送邮件3.6、异步发送邮件四、写在最后一、邮件发送的扩展关于......