返回顶部
首页 > 资讯 > 后端开发 > Python >Python 中怎么使用Asyncio实现异步编程
  • 815
分享到

Python 中怎么使用Asyncio实现异步编程

2023-06-17 03:06:13 815人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

python 中怎么使用Asyncio实现异步编程,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。异步是怎么一回事?在传统的顺序编程中, 所有发送给解释器的指令会一条条被执行

python 中怎么使用Asyncio实现异步编程,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

异步是怎么一回事?

在传统的顺序编程中, 所有发送给解释器的指令会一条条被执行。此类代码的输出容易显现和预测。 但是…

譬如说你有一个脚本向3个不同服务器请求数据。  有时,谁知什么原因,发送给其中一个服务器的请求可能意外地执行了很长时间。想象一下从第二个服务器获取数据用了10秒钟。在你等待的时候,整个脚本实际上什么也没干。如果你可以写一个脚本可以不去等待第二个请求而是仅仅跳过它,然后开始执行第三个请求,然后回到第二个请求,执行之前离开的位置会怎么样呢。就是这样。你通过切换任务最小化了空转时间。尽管如此,当你需要一个几乎没有I/O的简单脚本时,你不想用异步代码。

还有一件重要的事情要提,所有代码在一个线程中运行。所以如果你想让程序的一部分在后台执行同时干一些其他事情,那是不可能的。

准备开始

这是 asyncio 主概念最基本的定义:

  • 协程— 消费数据的生成器,但是不生成数据。Python 2.5 介绍了一种新的语法让发送数据到生成器成为可能。我推荐查阅David Beazley “A  Curious Course on Coroutines and Concurrency” 关于协程的详细介绍。

  • 任务— 协程调度器。如果你观察下面的代码,你会发现它只是让 event_loop 尽快调用它的_step ,同时 _step  只是调用协程的下一步。

class Task(futures.Future):       def __init__(self, coro, loop=None):         super().__init__(loop=loop)         ...         self._loop.call_soon(self._step)      def _step(self):             ...         try:             ...             result = next(self._coro)         except StopIteration as exc:             self.set_result(exc.value)         except BaseException as exc:             self.set_exception(exc)             raise         else:             ...             self._loop.call_soon(self._step)
  • 事件循环— 把它想成 asyncio 的中心执行器。

现在我们看一下所有这些如何融为一体。正如我之前提到的,异步代码在一个线程中运行。

Python 中怎么使用Asyncio实现异步编程

从上图可知:

消息循环是在线程中执行

从队列中取得任务

每个任务在协程中执行下一步动作

如果在一个协程中调用另一个协程(await  <coroutine_name>),会触发上下文切换,挂起当前协程,并保存现场环境(变量,状态),然后载入被调用协程

如果协程的执行到阻塞部分(阻塞I/O,Sleep),当前协程会挂起,并将控制权返回到线程的消息循环中,然后消息循环继续从队列中执行下一个任务...以此类推

队列中的所有任务执行完毕后,消息循环返回***个任务

异步和同步的代码对比

现在我们实际验证异步模式的切实有效,我会比较两段 python 脚本,这两个脚本除了 sleep 方法外,其余部分完全相同。在***个脚本里,我会用标准的  time.sleep 方法,在第二个脚本里使用 asyncio.sleep 的异步方法。

这里使用 Sleep 是因为它是一个用来展示异步方法如何操作 I/O 的最简单办法。

使用同步 sleep 方法的代码:

import asyncio   import time   from datetime import datetime   async def custom_sleep():       print('SLEEP', datetime.now())     time.sleep(1)  async def factorial(name, number):       f = 1     for i in range(2, number+1):         print('Task {}: Compute factorial({})'.fORMat(name, i))         await custom_sleep()         f *= i     print('Task {}: factorial({}) is {}\n'.format(name, number, f))   start = time.time()   loop = asyncio.get_event_loop()  tasks = [       asyncio.ensure_future(factorial("A", 3)),     asyncio.ensure_future(factorial("B", 4)), ] loop.run_until_complete(asyncio.wait(tasks))   loop.close()  end = time.time()   print("Total time: {}".format(end - start))

脚本输出:

Task A: Compute factorial(2)   SLEEP 2017-04-06 13:39:56.207479   Task A: Compute factorial(3)   SLEEP 2017-04-06 13:39:57.210128   Task A: factorial(3) is 6  Task B: Compute factorial(2)   SLEEP 2017-04-06 13:39:58.210778   Task B: Compute factorial(3)   SLEEP 2017-04-06 13:39:59.212510   Task B: Compute factorial(4)   SLEEP 2017-04-06 13:40:00.217308   Task B: factorial(4) is 24  Total time: 5.016386032104492

使用异步 Sleep 的代码:

import asyncio   import time   from datetime import datetime   async def custom_sleep():       print('SLEEP {}\n'.format(datetime.now()))     await asyncio.sleep(1)  async def factorial(name, number):       f = 1     for i in range(2, number+1):         print('Task {}: Compute factorial({})'.format(name, i))         await custom_sleep()         f *= i     print('Task {}: factorial({}) is {}\n'.format(name, number, f))   start = time.time()   loop = asyncio.get_event_loop()  tasks = [       asyncio.ensure_future(factorial("A", 3)),     asyncio.ensure_future(factorial("B", 4)), ] loop.run_until_complete(asyncio.wait(tasks))   loop.close()  end = time.time()   print("Total time: {}".format(end - start))

脚本输出:

Task A: Compute factorial(2)   SLEEP 2017-04-06 13:44:40.648665  Task B: Compute factorial(2)   SLEEP 2017-04-06 13:44:40.648859  Task A: Compute factorial(3)   SLEEP 2017-04-06 13:44:41.649564  Task B: Compute factorial(3)   SLEEP 2017-04-06 13:44:41.649943  Task A: factorial(3) is 6  Task B: Compute factorial(4)   SLEEP 2017-04-06 13:44:42.651755  Task B: factorial(4) is 24  Total time: 3.008226156234741

从输出可以看到,异步模式的代码执行速度快了大概两秒。当使用异步模式的时候(每次调用 await asyncio.sleep(1)  ),进程控制权会返回到主程序的消息循环里,并开始运行队列的其他任务(任务A或者任务B)。

关于Python 中怎么使用Asyncio实现异步编程问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网Python频道了解更多相关知识。

--结束END--

本文标题: Python 中怎么使用Asyncio实现异步编程

本文链接: https://lsjlt.com/news/287061.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python 中怎么使用Asyncio实现异步编程
    Python 中怎么使用Asyncio实现异步编程,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。异步是怎么一回事在传统的顺序编程中, 所有发送给解释器的指令会一条条被执行。...
    99+
    2023-06-17
  • Python中怎么利用Asyncio实现异步编程
    本篇文章为大家展示了Python中怎么利用Asyncio实现异步编程,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。异步是怎么一回事在传统的顺序编程中, 所有发送给解释器的指令会一条条被执行。此类代码...
    99+
    2023-06-17
  • python中的asyncio异步协程怎么实现
    这篇“python中的asyncio异步协程怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“python中的async...
    99+
    2023-06-30
  • python中asyncio异步编程学习
    1.   想学asyncio,得先了解协程 携程的意义: 计算型的操作,利用协程来回切换执行,没有任何意义,来回切换并保存状态 反倒会降低性能。 ...
    99+
    2024-04-02
  • 怎么在python中利用asyncio实现异步IO
    这篇文章给大家介绍怎么在python中利用asyncio实现异步IO,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;3、网络爬虫;4、嵌...
    99+
    2023-06-14
  • python中asyncio异步编程的示例分析
    这篇文章将为大家详细讲解有关python中asyncio异步编程的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.   想学asyncio,得先了解协程携程的意义:计算型的操...
    99+
    2023-06-14
  • python 中的 asyncio 异步协程
    目录一、定义协程二、运行协程三、协程回调四、运行多个协程五、run_forever六、多协程中关闭run_forever一、定义协程 asyncio 执行的任务,称为协程,但是Asy...
    99+
    2024-04-02
  • Python协程asyncio异步编程笔记分享
    目录1.事件循环2.协程和异步编程2.1 基本使用 2.2 await 2.3 Task对象 1.事件循环 可以理解成为一个死循环,去检查任务列表中的任务,如果可执行就去执行,如果检...
    99+
    2024-04-02
  • asyncio异步编程中Task对象是什么
    小编给大家分享一下asyncio异步编程中Task对象是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1.Task对象的作用可以将多个任务添加到事件循环当中,...
    99+
    2023-06-29
  • SpringBoot 中怎么实现异步编程
    这期内容当中小编将会给大家带来有关SpringBoot 中怎么实现异步编程,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Future 模式异步编程在处理耗时操作以及多任务...
    99+
    2024-04-02
  • C#中怎么利用AsyncResult实现异步编程
    这篇文章给大家介绍C#中怎么利用AsyncResult实现异步编程,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。C#异步编程模式IAsyncResult概述IAsyncResult 异步设计模式通过名为 BeginOp...
    99+
    2023-06-17
  • C#怎么使用async和await实现异步编程
    这篇文章主要介绍“C#怎么使用async和await实现异步编程”,在日常操作中,相信很多人在C#怎么使用async和await实现异步编程问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#怎么使用async...
    99+
    2023-07-02
  • 揭秘 Python asyncio:释放异步编程的无限可能
    简介 在现代计算中,异步编程正变得越来越流行。这是一种允许应用程序同时处理多个任务的编程范例,从而提高效率并最大限度地利用计算机资源。Python asyncio 是一个专为异步编程而设计的库,它提供了广泛的功能和工具,使开发人员能够轻...
    99+
    2024-03-03
    Python asyncio, 异步编程, 协程, 事件循环
  • Dart中的异步编程怎么使用
    这篇文章主要讲解了“Dart中的异步编程怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Dart中的异步编程怎么使用”吧!一 事件循环flutter 就是运行在一个root isola...
    99+
    2023-07-06
  • C#中怎么实现异步网络编程
    这期内容当中小编将会给大家带来有关C#中怎么实现异步网络编程,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。C#异步网络编程两大方法一、Asynchronous Sockets的方法Socket类的很多连接...
    99+
    2023-06-17
  • Android Flutter异步编程怎么实现
    这篇文章主要介绍“Android Flutter异步编程怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Android Flutter异步编程怎么实现”文章能帮助大家解决问...
    99+
    2023-07-05
  • Java 异步编程教程:如何在http请求中使用多线程实现异步编程?
    Java是一种面向对象的编程语言,具有很好的可移植性和可扩展性,在Web开发中广泛应用。然而,由于Web应用程序需要处理大量的http请求,因此必须采用异步编程技术,以确保Web应用程序的性能和可扩展性。 在本文中,我们将介绍如何使用Ja...
    99+
    2023-06-25
    异步编程 教程 http
  • 如何使用Python对象实现异步编程算法?
    随着计算机硬件的不断升级和技术的不断发展,我们已经可以编写出更加高效的程序,以便更好地利用计算机资源。在编写程序时,异步编程是一种非常有用的技术。在本文中,我们将介绍如何使用Python对象来实现异步编程算法。 Python是一种高级编程...
    99+
    2023-07-08
    对象 异步编程 编程算法
  • Java中如何使用对象实现异步编程?
    随着计算机技术的不断发展,异步编程成为了越来越重要的技术,它可以有效地提高程序的效率,让程序更加稳定。在Java中,异步编程也是非常重要的一个技术,它可以让我们更好地利用CPU资源,提高程序的并发性。本文将介绍如何使用对象实现Java中的...
    99+
    2023-07-07
    文件 异步编程 对象
  • ASP中如何使用数组实现异步编程?
    异步编程是一种在Web开发中常见的技术,它可以使网页更加高效、快速地响应用户的操作。在ASP中,我们可以通过使用数组来实现异步编程,让网页更加流畅,提高用户体验。本文将介绍ASP中如何使用数组实现异步编程,包括数组的基本概念、异步编程的实...
    99+
    2023-11-12
    数组 异步编程 leetcode
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作