浅谈Python异步编程

这篇具有很好参考价值的文章主要介绍了浅谈Python异步编程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 异步编程概述

异步编程是一种编程范式,用于处理那些需要等待I/O操作完成或者耗时任务的情况。在传统的同步编程中,代码会按照顺序逐行执行,直到遇到一个耗时操作,它会阻塞程序的执行直到操作完成。这种阻塞式的模型在某些场景下效率低下,因为代码在等待操作完成时无法执行其他任务。

异步编程通过使用非阻塞I/O和协程(coroutine)来提高效率。协程是一种特殊的函数,可以在执行过程中暂停和恢复。当一个协程遇到一个耗时操作时,它会暂停自己的执行,让出控制权给其他协程,从而实现并发执行。async/await关键字是Python中处理协程的语法工具

2. async/await关键字

async关键字

async是一个关键字,用于定义一个协程函数。协程函数可以通过使用await关键字来暂停自身的执行,等待其他协程或异步操作完成。

以下是一个简单的示例,展示了如何定义一个协程函数:

import asyncio

async def my_coroutine():
    print("Coroutine started")
    await asyncio.sleep(1)
    print("Coroutine resumed")
    return "Result"

my_coroutine是一个协程函数。它使用了async关键字进行定义,并包含了一个await语句来暂停执行。

await关键字

await是另一个关键字,用于暂停协程函数的执行,等待另一个协程、异步操作或者Future对象完成。

以下是一个使用await的示例:

import asyncio

async def my_coroutine():
    print("Coroutine started")
    await asyncio.sleep(1)
    print("Coroutine resumed")
    return "Result"

async def main():
    result = await my_coroutine()
    print(f"Result: {result}")

asyncio.run(main())

在上面的示例中,main函数是一个协程函数,它使用await关键字来等待my_coroutine协程函数的执行结果。当await语句执行时,main函数会暂停自身的执行,直到my_coroutine协程函数完成并返回结果。

需要注意的是,await关键字只能在协程函数中使用。如果你在普通的同步函数中使用await,会导致语法错误。

3. 异步事件循环

异步编程的核心是事件循环(event loop)。事件循环负责调度和执行协程,确保它们按照正确的顺序执行。

在Python中,可以使用asyncio模块提供的事件循环来创建和管理协程。

以下是一个使用事件循环的示例:

import asyncio

async def my_coroutine():
    print("Coroutine started")
    await asyncio.sleep(1)
    print("Coroutine resumed")
    return "Result"

async def main():
    result = await my_coroutine()
    print(f"Result: {result}")

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

在上面的示例中,asyncio.get_event_loop()用于获取默认的事件循环对象。然后,通过调用run_until_complete方法来运行main协程函数,直到它完成

异步编程最常见的用例是处理I/O操作,例如读写文件或与网络通信。在传统的同步编程中,这些操作会阻塞程序的执行,直到操作完成。而在异步编程中,可以使用异步IO操作来实现非阻塞的并发执行。

4. 异步IO操作

Python提供了asyncio模块来处理异步IO操作。asyncio中的一些常用函数和类包括:

  • asyncio.sleep(delay): 创建一个休眠指定时间的协程。
  • asyncio.open_connection(host, port): 创建一个协程,用于与指定的主机和端口建立网络连接。
  • asyncio.open_unix_connection(path): 创建一个协程,用于与指定路径的UNIX域套接字建立连接。
  • asyncio.start_server(client_connected_cb, host, port): 创建一个协程,用于监听指定主机和端口的连接请求,并在每次连接时调用client_connected_cb回调函数。

以下是一个使用异步IO操作的示例:

import asyncio

async def read_data():
    # 模拟异步IO读取操作
    await asyncio.sleep(1)
    return "Data"

async def write_data(data):
    # 模拟异步IO写入操作
    await asyncio.sleep(1)
    print(f"Data written: {data}")

async def main():
    data = await read_data()
    await write_data(data)

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

在上面的示例中,read_datawrite_data函数模拟了异步的IO读取和写入操作。在main函数中,我们使用await关键字等待读取操作完成,然后将结果传递给写入操作。

执行步骤如下:

  1. 首先,创建一个事件循环(Event Loop)对象,使用asyncio.get_event_loop()获取默认的事件循环。

  2. 定义了三个协程函数:read_data()write_data()main()

  3. 调用loop.run_until_complete(main()),将main()协程任务提交给事件循环并运行,直到main()协程完成。

  4. main()协程中,首先调用read_data()协程函数。这会启动read_data()协程,并在await asyncio.sleep(1)处暂停执行,等待1秒钟。

  5. 在暂停执行的同时,事件循环可以切换到其他可运行的协程,例如write_data()协程。

  6. write_data()协程同样会启动,并在await asyncio.sleep(1)处暂停执行,等待1秒钟。

  7. write_data()协程暂停执行时,事件循环没有其他可运行的协程,因此它会等待,直到有其他协程可运行。

  8. 在等待1秒钟后,read_data()协程恢复执行。它完成后,返回结果"Data"。

  9. main()协程接收到read_data()协程的返回结果,将其赋值给data变量。

  10. main()协程继续执行,调用write_data(data)协程。

  11. write_data()协程恢复执行,打印出"data"的值。

  12. main()协程完成,事件循环结束。

在这个过程中,通过使用await关键字,协程能够在等待IO操作完成时暂停执行,并允许事件循环切换到其他协程。这种方式下,IO操作可以以异步的方式执行,而不会阻塞整个程序的执行流程。

5. 并发执行多个协程

异步编程的一个关键优势是能够并发执行多个协程,以提高程序的性能。

asyncio提供了多种方式来实现协程的并发执行,其中最常用的方式是使用asyncio.gather函数。

以下是一个并发执行多个协程的示例:

import asyncio

async def coroutine1():
    await asyncio.sleep(1)
    print("Coroutine 1 completed")

async def coroutine2():
    await asyncio.sleep(2)
    print("Coroutine 2 completed")

async def coroutine3():
    await asyncio.sleep(0.5)
    print("Coroutine 3 completed")

async def main():
    await asyncio.gather(coroutine1(), coroutine2(), coroutine3())

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

在上面的示例中,coroutine1coroutine2coroutine3是三个协程函数。在main函数中,我们使用asyncio.gather函数来并发执行这三个协程。asyncio.gather接受一个可变数量的协程参数,并返回一个新的协程,该协程在所有给定的协程完成后完成。执行循序为当执行到 coroutine1中的await时,此协程会挂起,执行权交给新的协程 coroutine2开始执行,以此类推。当 coroutine3 等待0.5s执行完毕后,执行权重新回到coroutine3 ,继续执行一下语句,其他同理。

需要注意的是,Python的协程是单线程的,通过事件循环来实现并发执行。当一个协程遇到阻塞的IO操作时,它会暂停自身的执行,并切换到下一个可执行的协程。这种切换是由事件循环调度文章来源地址https://www.toymoban.com/news/detail-711413.html

到了这里,关于浅谈Python异步编程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python异步编程之web框架 异步vs同步 文件IO任务压测对比

    主题: 比较异步框架和同步框架在文件IO操作的性能差异 python版本 :python 3.8 压测工具 :locust web框架 :同步:flask 异步:aiohttp、starlette 异步文件模块 :aiofiles、anyio.Path 请求并发量 : 模拟10个用户 服务器配置 : Intel(R) i7-12700F 客户端配置 :Intel(R) i7-8700 3.20GHz flask是python中轻

    2024年02月06日
    浏览(116)
  • Python异步编程之web框架异步vs同步 无IO任务压测对比

    在python编程中,通过协程实现的异步编程号称能够提高IO密集型任务的并发量。本系列比较web服务器同步框架和异步框架的性能差异,包括无IO接口和常见IO操作,如文件、mysql、redis等。使用压测工具locust测试相同条件下两种编程模式能够处理请求的速度。 主题: 单纯比较异

    2024年02月06日
    浏览(52)
  • Python异步编程之web框架 异步vs同步 数据库IO任务并发支持对比

    主题: 比较异步框架和同步框架在数据库IO操作的性能差异 python版本 :python 3.8 数据库 :mysql 8.0.27 (docker部署) 压测工具 :locust web框架 :同步:flask 异步:starlette 请求并发量 : 模拟10个用户 服务器配置 : Intel(R) i7-12700F 客户端配置 :Intel(R) i7-8700 3.20GHz python中操作数据库通常

    2024年02月08日
    浏览(58)
  • Python异步网络编程利器——详解aiohttp的使用教程

    在现代Web应用程序开发中,网络请求是非常常见的操作。然而,传统的同步网络请求方式在处理大量请求时会导致性能瓶颈。为了解决这个问题,Python提供了aiohttp库,它是一个基于异步IO的网络请求库,可以实现高效的并发网络请求。本文将详细介绍aiohttp的各种使用方法,帮

    2024年02月06日
    浏览(53)
  • 由浅入深走进Python异步编程【多进程】(含代码实例讲解 || multiprocessing、异步进程池、进程通信)

    从底层到第三方库,全面讲解python的异步编程。这节讲述的是python的多线程实现,纯干货,无概念,代码实例讲解。 本系列有6章左右,点击头像或者专栏查看更多内容,陆续更新,欢迎关注。 部分资料来源及参考链接: https://www.bilibili.com/video/BV1Li4y1j7RY/ 现在让我们初步进入

    2024年02月03日
    浏览(48)
  • Python异步编程之web框架 异步vs同步 数据库IO任务压测对比

    主题: 比较异步框架和同步框架在数据库IO操作的性能差异 python版本 :python 3.8 数据库 :mysql 8.0.27 (docker部署) 压测工具 :locust web框架 :同步:flask 异步:starlette 请求并发量 : 模拟10个用户 服务器配置 : Intel(R) i7-12700F 客户端配置 :Intel(R) i7-8700 3.20GHz python中操作数据库通常

    2024年02月08日
    浏览(93)
  • Python异步编程高并发执行爬虫采集,用回调函数解析响应

    异步技术是Python编程中对提升性能非常重要的一项技术。在实际应用,经常面临对外发送网络请求,调用外部接口,或者不断更新数据库或文件等操作。 这这些操作,通常90%以上时间是在等待,如通过REST, gRPC向服务器发送请求,通常可能等待几十毫秒至几秒,甚至更长。如

    2024年02月08日
    浏览(54)
  • 【文末送书】Python高并发编程:探索异步IO和多线程并发

    欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C++、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。搜索关注公粽号 《机器和智能》 发送“刷题宝

    2024年02月15日
    浏览(44)
  • Python异步编程探究:深入理解asyncio的使用和原理【第130篇—asyncio】

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 随着计算机应用程序的复杂性不断增加,对于高效处理I/O密集型任务的需求也越来越迫切。在Python中,asyncio模块提供了一种强大的异步编程

    2024年04月12日
    浏览(44)
  • Python黑魔法揭秘:装饰器、生成器、异步编程、GIL、描述符和元类

    Python中的某些特性被看作是“黑魔法”,原因在于它们的强大功能和复杂性。接下来,让我们深入探索这些特性。 装饰器是修改函数或类行为的强大工具,它提供了一种可读性强、代码重用的方式来增强或修改函数或类的行为。装饰器就像一个包裹原函数或类的外壳,能够在

    2024年02月14日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包