当前位置: 首页 > news >正文

页面好看的教育类网站模板下载西部中大建设集团有限公司网站

页面好看的教育类网站模板下载,西部中大建设集团有限公司网站,中国建设人才信息网,企业 网站 客户留言怎么做深入理解 Python 虚拟机#xff1a;协程初探——不过是生成器而已 在 Python 3.4 Python 引入了一个非常有用的特性——协程#xff0c;在后续的 Python 版本当中不断的进行优化和改进#xff0c;引入了新的 await 和 async 语法。在本篇文章当中我们将详细介绍一下 Python…深入理解 Python 虚拟机协程初探——不过是生成器而已 在 Python 3.4 Python 引入了一个非常有用的特性——协程在后续的 Python 版本当中不断的进行优化和改进引入了新的 await 和 async 语法。在本篇文章当中我们将详细介绍一下 Python 协程的原理以及虚拟机具体的实现协程的方式。 什么是协程 Coroutines are computer program components that allow execution to be suspended and resumed, generalizing subroutines for cooperative multitasking. 根据 wiki 的描述协程是一个允许停下来和恢复执行的程序从文字上来看这与我们的常识或者直觉是相互违背的因为在大多数情况下我们的函数都是执行完才返回的。其实目前 Python 当中早已有了一个特性能够做到这一点就是生成器如果想深入了解一下生成器的实现原理和相关的字节码可以参考这篇文章 深入理解 Python 虚拟机生成器停止背后的魔法 。 现在在 Python 当中可以使用 async 语法定一个协程函数当函数使用 async 进行修饰的时候这个函数就是协程函数当我们调用这个函数的时候会返回一个协程对象而不是直接调用函数 async def hello(): ... return 0 ... hello() coroutine object hello at 0x100a04740在 inspect 模块当中也有一个方法用于判断一个函数是否是协程函数 import inspectasync def hello():return 0print(inspect.iscoroutinefunction(hello)) # True在 Python 当中当你想创建一个协程的话就直接使用一个 async 关键字定一个函数调用这个函数就可以得到一个协程对象。 在协程当中可以使用 await 关键字等待其他协程完成当被等待的协程执行完成之后就会返回到当前协程继续执行 import asyncio import datetime import timeasync def sleep(t):time.sleep(t)async def hello():print(start a coroutine, datetime.datetime.now())await sleep(3)print(wait for 3s, datetime.datetime.now())if __name__ __main__:coroutine hello()try:coroutine.send(None)except StopIteration:print(coroutine finished)start a coroutine 2023-10-15 02:21:33.503505 wait for 3s 2023-10-15 02:21:36.503984 coroutine finished在上面的程序当中await sleep(3) 确实等待了 3 秒之后才继续执行。 协程的实现 在 Python 当中协程其实就是生成器只不过在生成器的基础之上稍微包装了一下比如在写成当中的 await 语句其实作用和 yield from 对于生成器的作用差不多稍微有点细微差别。我们用几个例子来详细分析一下协程和生成器之间的关系 async def hello():return 0if __name__ __main__:coroutine hello()print(coroutine)try:coroutine.send(None)except StopIteration:print(coroutine finished)上面的代码的输出结果 coroutine object hello at 0x1170200c0 coroutine finished在上面的代码当中首先调用 hello 之后返回一个协程对象协程对象和生成器对象一样都有 send 方法而且作用也一样都是让协程开始执行。和生成器一样当一个生成器执行完成之后会产生 StopIteration 异常因此需要对异常进行 try catch 处理。和协程还有一个相关的异常为 StopAsyncIteration这一点我们在之后的文章详细说。 我们再来写一个稍微复杂一点例子 async def bar():return barasync def foo():name await bar()print(f{name })return fooif __name__ __main__:coroutine foo()try:coroutine.send(None)except StopIteration as e:print(f{e.value })上面的程序的输出结果如下所示 name bar e.value foo上面两个协程都正确的执行完了代码我们现在来看一下协程程序的字节码是怎么样的上面的 foo 函数对应的字节码如下所示 9 0 LOAD_GLOBAL 0 (bar)2 CALL_FUNCTION 04 GET_AWAITABLE6 LOAD_CONST 0 (None)8 YIELD_FROM10 STORE_FAST 0 (name)10 12 LOAD_GLOBAL 1 (print)14 LOAD_CONST 1 (name )16 LOAD_FAST 0 (name)18 FORMAT_VALUE 2 (repr)20 BUILD_STRING 222 CALL_FUNCTION 124 POP_TOP11 26 LOAD_CONST 2 (foo)28 RETURN_VALUE在上面的代码当中和 await 语句相关的字节码有两条分别是 GET_AWAITABLE 和 YIELD_FROM在函数 foo 当中首先会调用函数 bar 得到一个协程对象得到的这个协程对象会放到虚拟机的栈顶然后执行 GET_AWAITABLE 这条字节码来说对于协程来说相当于没执行。他具体的操作为弹出栈顶元素如果栈顶元素是一个协程对象则直接将这个协程对象再压回栈顶如果不是则调用对象的 __await__ 方法将这个方法的返回值压入栈顶。 然后需要运行的字节码就是 YIELD_FROM这个字节码和 “yield from” 语句对应的字节码是一样的这就是为什么说协程就是生成器准确的来说还是有点不一样因为协程只是通过生成器的机制来完成具体的实现需要编译器、虚拟机和标准库协同工作才能够很好的完成协程程序而且在虚拟机当中与协程有关的对象有好几个[都是基于生成器]。如果你不了解 YIELD_FROM 的工作原理可以参考这篇文章深入理解 Python 虚拟机生成器停止背后的魔法。 我们在使用生成器的方式来重写上面的程序 def bar():yield # 这条语句的主要作用是将函数编程生成器return bardef foo():name yield from bar()print(f{name })return fooif __name__ __main__:generator foo()try:generator.send(None) # 运行到第一条 yield 语句generator.send(None) # 从 yield 语句运行完成except StopIteration as e:print(f{e.value })我们再来看一下 foo 函数的字节码 7 0 LOAD_GLOBAL 0 (bar)2 CALL_FUNCTION 04 GET_YIELD_FROM_ITER6 LOAD_CONST 0 (None)8 YIELD_FROM10 STORE_FAST 0 (name)8 12 LOAD_GLOBAL 1 (print)14 LOAD_CONST 1 (name )16 LOAD_FAST 0 (name)18 FORMAT_VALUE 2 (repr)20 BUILD_STRING 222 CALL_FUNCTION 124 POP_TOP9 26 LOAD_CONST 2 (foo)28 RETURN_VALUE字节码 GET_YIELD_FROM_ITER 就是从一个对象当中获取一个生成器。这个字节码会弹出栈顶对象如果对象是一个生成器则直接返回并且将它再压入栈顶如果不是则调用对象的 __iter__ 方法将这个返回对象压入栈顶。后续执行 YIELD_FROM 方法就和前面的协程一样了。 总结 在本篇文章当中简单的介绍了一下协程是什么以及在 CPython 当中协程是通过什么方式实现的从字节码的角度来看 生成器和协程本质上使用的字节码是一样的都是使用 YIELD_FROM 字节码实现的协程就是在生成器的基础之上实现的。 本篇文章是深入理解 python 虚拟机系列文章之一文章地址https://github.com/Chang-LeHung/dive-into-cpython 更多精彩内容合集可访问项目https://github.com/Chang-LeHung/CSCore 关注公众号一无是处的研究僧了解更多计算机Java、Python、计算机系统基础、算法与数据结构知识。
http://www.yutouwan.com/news/407825/

相关文章:

  • 网站建设捌金手指花总十六重庆建设医院官方网站
  • 网站推广营销策划如何备份wordpress主题
  • 网站的设计 改版 更新深圳网站设..
  • 个人博客网站开发毕业设计360官网入口
  • 竹子建站免费版wordpress控制台
  • 宁波网站优化建站公司汕头网站制作哪家强
  • 做商城类网站空间怎么买中国室内设计公司排名前十强
  • 有哪些做ppt用图片的网站网站开发合作合同
  • 天津网站建设公司排名广州营销型网站建设
  • 网站后期增加产品wordpress 图片 二级域名
  • 免费自助建站网站php网站开发实例教程百度
  • asp企业网站源码下载学做网站教程视频
  • 顺义建站好的公司贫困户房屋建设补助在哪个网站公布
  • ai logo设计网站精品网站建设费用 v磐石网络
  • 做钢管网站企业网站源代码下载
  • 网站首页制作模板网上推广培训
  • 网页设计培训机构学什么好营销排名seo
  • wordpress企业网站 教程余干网站建设制作
  • 内容管理系统做网站万网有域名怎么建网站
  • 一个服务器做一样的网站网站搭建本地环境
  • 网站建设与管理心得体会和总结计算机应用软件开发
  • 辽宁建设厅投诉网站凡科网的网站建设怎么做
  • 公司在选择网站时应考虑什么wordpress积分内容
  • 做礼品的网站技术类网站模板
  • php 微信 网站建设做网站充值犯法吗
  • 旅游网站开发建设方案湘潭做网站电话磐石网络
  • 东莞网站建设曼哈顿新科怎么做自动下单网站
  • 全站仪建站视频遵义市网站建设公司
  • phpcms v9做网站建个网站多少费用
  • 盐城市城乡建设门户网站营养师