作家
登录

Python协程:概念及其用法

作者: 来源: 2017-06-15 17:02:36 阅读 我要评论

asyncio解释

Python协程:概念及其用法

  1. start 0 
  2.  
  3. start 1 
  4.  
  5. start 2 
  6.  
  7. end 1 
  8.  
  9. end 2 
  10.  
  11. end 0  

真正有常识的人的成长过程,就像麦穗的成长过程:麦穗空的时刻,麦子长得很快,麦穗骄傲地高昂扬起,然则,麦穗成熟饱满时,它们开端谦虚,垂下麦芒。

——蒙田《蒙田漫笔全集》

上篇《Python 多线程鸡年不鸡肋》阐述了关于python多线程是否是鸡肋的问题,获得了一些网友的承认,当然也有一些不合看法,表示协程比多线程不知强若干,在协程面前多线程算是鸡肋。好吧,对此我也表示赞成,然而上篇我阐述的不雅点不在于多线程与协程的比较,而是在于IO密集型法度榜样中,多线程另有效武之地。

对于协程,我表示其效力确非多线程能比,但本人对此懂得并不深刻,是以比来几日参考了一些材料,进修整顿了一番,在此分享出来仅供大年夜家参考,如有谬误请斧正,多谢。申明:本文介绍的协程是入门级别,大年夜神请绕道而行,谨防入坑。

python3.x协程应用:

  • asynico + yield from(python3.4)
  • asynico + await(python3.5)
  • gevent

文┞仿思路:本文将先介绍协程的概念,然后分别介绍Python2.x与3.x下协程的用法,最终将协程与多线程做比较并介绍异步爬虫模块。

协程

概念

换成多线程的代码看看:

协程,又称微线程,纤程,英文名Coroutine。协程的感化,是在履行函数A时,可以随时中断,去履行函数B,然后中断持续履行函数A(可以自由切换)。但这一过程并不是函数调用(没有调用语句),这一全部过不雅察似像多线程,然而协程只有一个线程履行。

解释:协程可以处理IO密集型法度榜样的效力问题,然则处理CPU密集型不是它的长处,如要充分发挥CPU应用率可以结合多过程+协程。

以上只是协程的一些概念,可能听起来比较抽象,那么我结合代码讲一讲吧。这里重要介绍协程在Python的应用,Python2对协程的支撑比较有限,生成器的yield实现了一部分但不完全,gevent模块倒是有比较好的实现;Python3.4今后惹人了asyncio模块,可以很好的应用协程。

Python2.x协程

python2.x协程应用:

  • yield
  • gevent

python2.x中支撑协程的模块不多,gevent算是比较常用的,这里就R单介绍一下gevent的用法。

Gevent

gevent是第三方库,经由过程greenlet实现协程,其根本思惟:

当一个greenlet碰到IO操作时,比如拜访收集,就主动切换到其他的greenlet,比及IO操作完成,再在恰当的时刻切换回来持续履行。因为IO操作异常耗时,经常使法度榜样处于等待状况,有了gevent为我们主动切换协程,就包管总有greenlet在运行,而不是等待IO。

优势

  • 履行效力极高,因为子法度榜样切换(函数)不是线程切换,由法度榜样自身控制,没有切换线程的开销。所以与多线程比拟,线程的数量越多,协程机能的优势越明显。
  • 不须要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在控制共享资本时也不须要加锁,是以履行效力高很多。

Install

  1. pip install gevent 

解释:大年夜结不雅上来看,履行get_body的次序应当先是输出”start”,然后履行到urllib2时碰着IO堵塞,则会主动切换运行下一?法度榜样(持续履行get_body输出start),直到urllib2返回结不雅,再履行end。也就是说,法度榜样没有等待urllib2请求网站返回结不雅,而是直接先跳过了,等待履行完毕再回来获取返回值。值得一提的是,在此过程中,只有一个线程在履行,是以这与多线程的概念是不一样的。

最新版貌似支撑windows了,之前测试似乎windows上运行不了……

Usage

起首来看一个简单的爬虫例子:

  1. #! -*- coding:utf-8 -*- 
  2.  
  3. import gevent 
  4.  
  5. from gevent import monkey;monkey.patch_all() 
  6.  
  7. import urllib2 
  8.  
  9. def get_body(i): 
  10.  
  11. print "start",i 
  12.  
  13. urllib2.urlopen("http://cn.bing.com"
     1/4    1 2 3 4 下一页 尾页

      推荐阅读

      Linux常用性能分析命令

    机能分析vmstat虚拟内存统计用法Usage: vmstat [options] [delay [count]] Options: -a, --active active/inactive memory -f, --forks number of forks since boot -m, --slabs slabinfo -n, --one-header do>>>详细阅读


    本文标题:Python协程:概念及其用法

    地址:http://www.17bianji.com/lsqh/35784.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)