热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python异步的简单介绍

这是Python中asyncio库的基本概念入门。如果您来过这里,那么您可能听说过异步,并发和并行性之类的词。在开始使用asyncio之前,
这是Python中asyncio库的基本概念入门。

如果您来过这里,那么您可能听说过异步,并发和并行性之类的词。 在开始使用asyncio之前,让我们快速地(通过示例)正确了解这些词的一些基本知识,以便为此基础打下坚实的基础。

并发 就像在单个核心CPU上运行两个线程一样。 每个线程的指令都可以交错,但是在任何给定时间,两个线程中只有一个正在积极进行中。

并行性就像让两个线程在多核CPU的不同内核上同时运行一样。

重要的是要注意,并行性意味着并发,但并非相反。

异步是一个较高级别的编程概念,您可以在其中启动一些任务,并确定虽然没有该任务的结果,但最好还是做一些其他工作而不是等待。

当您异步执行操作时,根据定义,这意味着这些操作之间是并发的。

为什么要异步编程?

我们为什么要编写您所说的异步程序-因为它可以多次提高程序的性能。 假设您有一台运行应用程序的核心机器。 您收到一个请求,并且需要进行两个数据库查询才能满足该请求。 每个查询需要50毫秒的时间。 对于同步程序,只有在完成第一个请求后才发出第二个请求-总时间为100毫秒。 使用异步程序,您可以一个接一个地触发这两个查询,总时间为50毫秒。

异步

Asyncio就是用Python编写异步程序。 Asyncio是事件循环 , 任务协同程序之间完美结合的美妙交响-它会让您哭泣。

事件循环

这就是一切的可能-一个简单的循环就这样。 嗯,不是那么简单 。 但是这是它的工作方式。 事件循环是交响曲的编排者。 它一个接一个地运行任务 。 在任何给定时间,只有一项任务正在运行。

可以想象,由于其他任务正在等待轮换,因此正在执行的任务承受着很大的压力。 因此,当活动任务发出阻塞呼叫(例如网络请求)并且无法继续进行时,它将控制权交给事件循环,从而意识到其他一些任务可能会更好地利用事件循环的时间。 它还告诉事件循环它到底被阻止了什么,以便当网络响应到来时,事件循环可以考虑给它时间再次运行。

事件循环时间很宝贵。 如果您没有取得进展,则应该退出循环,以便其他人可以。 事件循环是进度的度量。

协程和任务

协程(合作程序)是交响曲的关键元素。 当协程没有任何用处时,正是协程及其协作性质使放弃对事件循环的控制成为可能。 协程是子例程概念的有状态概括。

子例程是您良好的老式函数或方法。 您调用子例程来执行计算。 您可以再次调用它,但是在两次调用之间它不会保持状态。 每次调用都是全新的,并且执行相同的计算。

另一方面,协程是一个可爱的小状态小部件。 它看起来像一个子例程,但是在两次执行之间保持状态。 换句话说,当协程“返回”(产量控制)时,它只是意味着它已暂停执行(具有某种保存状态)。 因此,当您随后“调用”(控制)协程时,可以说协程已从保存状态恢复执行是正确的。

协程看起来像一个普通的函数,但是在它们的行为上,它们是带有resume()pause()有状态对象,就像方法一样。

在Python 3.5+中, 协程自身暂停的方式是使用await关键字。 在协程内部,当您await另一个协程时,您退出事件循环并计划已等待的协程立即运行。 也就是说,在协程内部await other_coroutine将暂停它,并安排协程other_coroutine立即运行。

请注意,事件循环不会抢占正在运行的协程。 只有协程可以停下来。

以下是协程如何相互配合的非常简单的示例(Python 3.5+) 。 在此示例中,我们将使用预定义的协程asyncio.sleep来帮助我们模拟阻止任务,但是在现实世界中,它可以是任何内容,例如网络请求,数据库查询等。

请注意, 代码在单个线程中运行 ,但是输出将具有交错的打印语句。 发生这种情况的原因是,当协程被阻塞时,它会退出循环,以便其他协程可以运行(是的!使用asyncio进行异步编程)。

python运行coroutine_example.py

注意事项

  • 调用协程定义不会执行它 。 它初始化一个协程对象 。 您需要await 协程对象 ,而不是协程定义,如上面line 8 line 17line 17所示。
  • 事件循环运行任务 ,而不是直接协程对象 。 任务是协程对象的包装。 当编写await coroutine_object ,实际上是安排了一个包装器任务,使其立即在事件循环上运行。
  • asyncio.sleep也是协程,由asyncio库提供。 asyncio.sleep(2)初始化一个协程对象,值为2秒。 await时,可以控制事件循环。 睡眠协程很聪明,不会阻塞循环。 它立即释放控制权,仅要求循环在指定时间后将其唤醒。 时间到期后,将其交还给控件,并立即返回,从而取消阻塞其调用方(在上面的示例中, coroutine_1coroutine_2 )。
  • 上面的示例在事件循环上运行了三种不同类型的协程,即coroutine_1 , coroutine_2asyncio.sleep 。 但是,有四个不同的任务在循环上运行,分别对应于以下协程对象—预定在line 25 coroutine_1()coroutine_2() ,预定在line 8 asyncio.sleep(4)和预定于line 17 asyncio.sleep(5)
  • 在循环上调度任务(尽管不是立即)的另一种方法是使用ensure_future()AbstractEventLoop.create_task()方法,这两个方法都接受协程对象。 最后的示例代码演示了这些方法。

一个更现实而又简单的例子

python运行asyncio_example.py

ArchSaber的Python

在ArchSaber ,我们的目标之一一直是从客户的应用程序代码中深入挖掘见解。 我们的许多客户都依赖我们针对Python的APM解决方案。 因此,我们在理解该语言及其周围框架的复杂性方面付出了巨大的努力。 我们自己严重依赖Python-我们的许多分析引擎和ML代码都是用Python编写的,通过它我们可以将实时根本原因分析推送到客户的生产问题。

谢谢阅读。 如果您喜欢这篇文章,请订阅并分享。

From: https://hackernoon.com/a-simple-introduction-to-pythons-asyncio-595d9c9ecf8c



推荐阅读
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 开发笔记:python协程的理解
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了python协程的理解相关的知识,希望对你有一定的参考价值。一、介绍什么是并发?并发的本质就是 ... [详细]
  • 申明下哈本篇文章不是自己写的根据网上的文章再加上自己的加加点点反正大部分都是网站的智慧哈!!!1、线程基本概念1.1线程是什么࿱ ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
  • java drools5_Java Drools5.1 规则流基础【示例】(中)
    五、规则文件及规则流EduInfoRule.drl:packagemyrules;importsample.Employ;ruleBachelorruleflow-group ... [详细]
  • 详解 Python 的二元算术运算,为什么说减法只是语法糖?[Python常见问题]
    原题|UnravellingbinaryarithmeticoperationsinPython作者|BrettCannon译者|豌豆花下猫(“Python猫 ... [详细]
  • Python语言简介、环境搭建、PyCharm的安装和配置
    一、Python语言简介1.1Python语言的基本概念官方对Python语言的介绍如下:Python是一款易于学习且功能强大的编程语言。它具有高效率的数据结构,能够简单又有效地实 ... [详细]
  • 似乎有两种不同的方法可以将字符串转换为字节,如对typeerror的回答所示:str不支持缓冲区接口。这些方法中哪一种比较好或更适合用Python& ... [详细]
  • 丛api的python的简单介绍
    本文目录一览:1、如何使用python利用api获取天气预报 ... [详细]
  • 前言无论使用哪种语言,我们都需要关注性能优化,提高执行效率。选择脚本语言需要持久的速度。在某种程度上,这句话说明了Python作为一种脚 ... [详细]
  • Python语法上的区别及注意事项
    本文介绍了Python2x和Python3x在语法上的区别,包括print语句的变化、除法运算结果的不同、raw_input函数的替代、class写法的变化等。同时还介绍了Python脚本的解释程序的指定方法,以及在不同版本的Python中如何执行脚本。对于想要学习Python的人来说,本文提供了一些注意事项和技巧。 ... [详细]
  • 如何方便地退订邮件列表,避免混乱和烦恼
    本文介绍了如何方便地退订邮件列表,避免混乱和烦恼。文章指出,退订邮件列表可能会造成混乱,特别是当被意外添加到列表中时。为了快速、轻松地取消订阅,建议不要将退订电子邮件发送到用于发布消息的电子邮件地址。文章还介绍了邮件列表由邮件列表软件控制,作为邮件列表成员,可以对该软件进行一些用户控制。一些邮件列表允许使用自动电子邮件地址退订,但这可能会带来一些混乱。最后,文章提到退订邮件列表需要向电子邮件服务器发送特殊命令来脱离列表。 ... [详细]
author-avatar
沈晓燕-东东
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有