必须要学习的Python 异步知识

必须要学习的Python 异步知识

python中的异步编程最近变得越来越流行。python中有许多不同的库用于执行异步编程。其中一个库是asyncio,它是Python 3.4中添加的Python标准库。asyncio是异步编程在Python中变得越来越流行的部分原因。本文将解释什么是异步编程,并比较其中的一些库。让我们回顾一下历史,看看异步编程在python中是如何发展的。

这里还是要推荐下小编的Python学习群:483546416,不管你是小白还是大牛,小编我都欢迎,不定期分享干货,包括小编自己整理的一份2017最新的Python资料和0基础入门教程,欢迎初学和进阶中的小伙伴。在不忙的时间我会给大家解惑。

程序具有每一行按顺序执行的固有属性。例如,如果您有一行代码到达远程服务器以获取资源,这意味着您的程序在等待时什么都不做。它坐在那里等待回应,以便继续。在某些情况下,这是可以接受的,但在许多情况下,这是不能接受的。这方面的标准解决方案当然是线程化。程序可以旋转多个线程;每个线程一次只做一件事。

这些线程一起允许您的程序一次执行多个任务。线程化当然附带了许多注意事项。多线程程序更复杂,通常更容易出错,它们包括常见的麻烦问题:竞争条件、死锁、活锁和资源匮乏。

上下文开关程序

虽然异步编程可以防止所有这些问题,但它实际上是为一个完全不同的问题而设计的: CPU上下文切换。当有多个线程运行时,每个CPU内核一次只能运行一个线程。为了允许所有线程/进程共享资源,CPU经常进行上下文切换。为了过度简化,CPU以随机间隔保存线程的所有上下文信息并切换到另一个线程。CPU会以不确定的时间间隔在线程之间不断切换。线程也是资源,它们不是空闲的。

异步编程本质上是软件/用户空间线程,其中应用程序管理线程和上下文切换,而不是CPU。基本上,在异步世界中,上下文仅在定义的交换点而不是在非确定性间隔中交换。

非常有效率的秘书

现在让我们将这些概念与一个非计算机示例进行比较。试想一下,我们有一位效率极高、一点时间也不浪费的秘书,他总是把事情做好,努力让每一秒都达到最大。这个秘书——让我们叫他鲍勃——必须疯狂地同时处理多项任务才能做到这一点。鲍勃一次有5项任务:接听电话、做接待员(指导客人)、预订航班、处理会议日程和归档文件。现在让我们想象一下这是一个低流量的环境,因此电话、访客和会议请求很少。鲍勃的大部分时间都花在与一家航空公司打电话上,同时提交文件。这都是相当标准和容易想象的。当电话进来时,鲍勃会让航空公司保持不动,接电话,直接打电话,然后再回到航空公司。每当鲍勃注意到任何任务时,归档文件都会被搁置起来,因为它不需要立即注意。这是一个人同时完成许多任务,在适当的地方进行上下文切换。鲍勃是异步的。

这个线程版本看起来像5个Bob的,每个Bob只有一个任务,但在任何给定的时间只有一个被允许工作。会有一个控制Bob工作的设备,它对任务本身一无所知。因为设备不了解任务的事件性质,所以即使其中3个坐在那里什么也不做,它也会在5个Bob之间不断切换。例如,文件归档-鲍勃被打断,电话-鲍勃可以做一些工作,但电话-鲍勃没有关系,所以他只是回去睡觉。在所有的鲍勃之间切换浪费了时间,只是为了发现他们中的3个什么都没做。大约57 % (略少于3 / 5 )的上下文切换是免费的。是的,CPU上下文切换非常快,但没有任何东西是免费的。

绿色线程

绿色线程是异步编程的基本级别。绿色线程看起来和感觉完全像普通线程,只是线程是由应用程序代码而不是硬件调度的。gevent是一个使用绿色线程的著名python库。gevent基本上是绿色线程+ eventlet,一个非阻塞I / O网络库。gevent monkey将普通python库修补为具有非阻塞I / o。

回调型异步

虽然Python中存在许多异步库,但最流行的可能是Tornado和gevent。正如我们已经讨论过的gevent,让我们关注一下龙卷风是如何工作的。tornado是一个异步web框架,它使用回调样式来执行异步网络I / o。回调是一个函数,它意味着“完成此操作后,执行此函数”。它基本上是代码的“完成时”挂钩。换句话说,回拨就像你打电话给客户服务热线,然后立即留下你的电话号码并挂断,这样他们就可以在有空的时候给你回电,而不必永远等待。

让我们比较一下。如果要防止I / O阻塞,必须使用线程或异步。线程会遇到资源不足、死锁和争用情况等问题。它还会为CPU创建上下文切换开销。异步编程可以解决上下文切换错误,但也有它自己的问题。在python中,我们的选项是绿色线程或异步编程的回调样式。

异步等待

asyncio库正受到越来越多的关注,所以Python决定将其作为核心库。随着核心库的引入,他们还在Python 3.5中添加了关键字async和await。关键字旨在使您的代码更清楚地显示为异步;因此您的方法不会与生成器混淆。async关键字位于def之前,表示方法是异步的。await关键字将替换的yield,并更清楚地表明您正在等待coroutine完成。以下是我们的示例,但使用了异步/ await关键字。

您可以使用python中的几个选项来执行异步编程。您可以使用绿色线程、回调或真正的coroutines。虽然选择是丰富的,但其中最好的一个是asyncio。如果您能够使用Python 3.5,那么您实际上应该使用内置于Python核心中的。我鼓励您尝试asyncio,而不是在下一个项目中使用线程。

以上就是关于Python 异步的知识,关注我,我带给你更多编程相关的知识!

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值