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

python协程及应用(一):简介

前言:我一直在关注如何让开发变得更容易,效率更高,更不易出错。之前做过类似的努力,结合SOA和工作流引擎做的一个流程编辑:http:blog.csdn.netchgaoweiart
前言:我一直在关注如何让开发变得更容易,效率更高,更不易出错。之前做过类似的努力,结合SOA和工作流引擎做的一个流程编辑:http://blog.csdn.net/chgaowei/article/category/597366。它有它自身的缺陷:脚本和程序之间的耦合太大,脚本限制太多。
后来接触并且学习Python,它简洁而强大,应该是解决这类问题的一个思路。那天看到Python自带的生成器yield关键字,感觉着应该是解决逻辑问题的一个突破点(后面会介绍)。再后来参加Python con2011 china,看里面很多人提到了协程和Greenlet,特别是赖勇浩提出的口号:协程才是未来。当时很兴奋,我一直思考的问题有了解决方案。
  协程是什么?
可以参考一下维基百科:http://zh.wikipedia.org/wiki/%E5%8D%8F%E7%A8%8B。
我之前写过一篇文章:并发编程学习总结也提到过。我认为这个定义也许更加贴切:“编程语言提供的一种并发机制”。
先让我们来看一下进程和线程。
未来让计算机能够同时处理多个任务,操作系统有了进程的概念,而且在进程内部,基本可以认为当前系统只有一个进程在运行,操作系统对此作了非常好的封装。进程间的切换是有操作系统来完成的。
进程有一个问题,就是进程间切换耗费计算机资源非常大,而且申请一个新的进程的成本也非常高。所以后来就有了线程,它生成的成本和切换的消耗都比进程要低很多,而且线程间通信也非常方便。
线程的问题是:1)存在线程安全问题,出了问题非常不易定位。2)进程内部有线程数目的限制。3)随着并发量的增加,线程生成和切换的成本也变得昂贵。
解决并发还有一个方案是IO多路复用,它的效率确实非常高,但是代码复杂度也非常高:它把一个流程打散成一个个的节点,散落在多个地方,对开发和维护非常不利(这个是我们经常用的方案)。
 好,来看协程是如何解决这些问题的:
1)协程的生成成本更低。其实就是一块内存,记录之前的调用的栈信息。你甚至可以通过控制函数调用的层次来进一步降低协程的大小。要生成一个协程,只需要申请一块内存并赋值。
2)切换更快。基本是就是内存的拷贝的速度。
3)没有线程安全问题。一个进程内可以同时存在多个协程,但是只有一个协程是激活的,而且协程的激活和休眠时程序员通过编程来控制,而不是内核来控制的。这样就没有了线程安全问题。
4)可读性更好。相对于IO多路复用来说,你调用的服务接口或者IO接口是异步的,但是你的代码是流畅(顺序)的,并没有被异步和回调打乱。协程也是异步的,但是它会把异步的事件和回调封装起来,形成类似远程调用接口。
 一些资料:
赖勇浩在pycon 2011 china上列举了一个node.js用异步实现的一块代码和Python协程风格的代码很能说明问题:http://www.slideshare.net/laiyonghao/python-webgame-10452102
赖勇浩关于协程的文章非常不错,可以作为参考,可惜没有写完:协程三篇之一(协程初接触)。
赖勇浩自己也做了一个机遇Google protocol buffer和Greenlet的远程调用框架abu.rpc,有兴趣的可以参考一下(在写这篇文章之前,还一直没有抽出时间看一下)。
  提供协程机制的编程语言:
现在很多语言都提供协程机制,或者通过第三方模块来实现协程。目前据我所知,支持协程的语言包括:Python,lua,erlang,go,io,ruby,c#等。我甚至还看到一些文章会在c中使用go和switch或者longjmp/setjmp来实现协程,不过很难再实际项目中使用。
  Python的协程实现:
yield可以实现协程。另外,还有很多第三方的版本,比如greenlet。
  协程可以用来做什么?
1)描述逻辑:我主要把协程用来描述逻辑。一个流程可能需要调用多个接口,其中很多接口是异步的。这样描述起来会困难一点。用线程是可以解决部分问题,但是复杂度提升。
2)提高并发:主要应用在IO密集型应用中。gevent就是在greenlet基础之上的一个处理并发的框架,和上面的区别是,这里的事件及接口是IO接口。
  缺陷:
无法使用多核。不过可以通过进程+协程来解决。
 
 
分类:  软件设计

推荐阅读
  • 作为140字符的开创者,Twitter看似简单却异常复杂。其简洁之处在于仅用140个字符就能实现信息的高效传播,甚至在多次全球性事件中超越传统媒体的速度。然而,为了支持2亿用户的高效使用,其背后的技术架构和系统设计则极为复杂,涉及高并发处理、数据存储和实时传输等多个技术挑战。 ... [详细]
  • 本文详细介绍了 Java 网站开发的相关资源和步骤,包括常用网站、开发环境和框架选择。 ... [详细]
  • Cookie学习小结
    Cookie学习小结 ... [详细]
  • 本文整理了一份基础的嵌入式Linux工程师笔试题,涵盖填空题、编程题和简答题,旨在帮助考生更好地准备考试。 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 掌握PHP编程必备知识与技巧——全面教程在当今的PHP开发中,了解并运用最新的技术和最佳实践至关重要。本教程将详细介绍PHP编程的核心知识与实用技巧。首先,确保你正在使用PHP 5.3或更高版本,最好是最新版本,以充分利用其性能优化和新特性。此外,我们还将探讨代码结构、安全性和性能优化等方面的内容,帮助你成为一名更高效的PHP开发者。 ... [详细]
  • 本文探讨了 TypeScript 中泛型的重要性和应用场景,通过多个实例详细解析了泛型如何提升代码的复用性和类型安全性。 ... [详细]
  • 面试题总结_2019年全网最热门的123个Java并发面试题总结
    面试题总结_2019年全网最热门的123个Java并发面试题总结 ... [详细]
  • 本文将介绍如何在混合开发(Hybrid)应用中实现Native与HTML5的交互,包括基本概念、学习目标以及具体的实现步骤。 ... [详细]
  • 本文旨在探讨信息安全专业的职业规划路径,结合个人经历和专家建议,为即将毕业的学生提供实用的指导。 ... [详细]
  • EST:西湖大学鞠峰组污水厂病原菌与土著反硝化细菌是多重抗生素耐药基因的活跃表达者...
    点击蓝字关注我们编译:祝新宇校稿:鞠峰、袁凌论文ID原名:PathogenicandIndigenousDenitrifyingBacte ... [详细]
  • 用阿里云的免费 SSL 证书让网站从 HTTP 换成 HTTPS
    HTTP协议是不加密传输数据的,也就是用户跟你的网站之间传递数据有可能在途中被截获,破解传递的真实内容,所以使用不加密的HTTP的网站是不 ... [详细]
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • 利用Python与Android进行高效移动应用开发
    通过结合Python和Android,可以实现高效的移动应用开发。首先,需要安装Scripting Layer for Android (SL4A),这是一个开源项目,旨在为Android系统提供脚本语言支持。SL4A不仅简化了开发流程,还允许开发者使用Python等高级语言编写脚本,从而提高开发效率和代码可维护性。此外,SL4A还支持多种其他脚本语言,进一步扩展了其应用范围。通过这种方式,开发者可以快速构建功能丰富的移动应用,同时保持较高的灵活性和可扩展性。 ... [详细]
author-avatar
手浪用户2602890763
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有