作家
登录

Python协程:概念及其用法

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

  •  
  • print "end",i 
  •  
  • tasks=[gevent.spawn(get_body,i) for i in range(3)] 
  •  
  • gevent.joinall(tasks)  
  • 运行结不雅:

    1. start 0 
    2.  
    3. start 1 
    4.  
    5. start 2 
    6.  
    7. end 2 
    8.  
    9. end 0 
    10.  
    11. end 1  
    1. import threading 
    2.  
    3. import urllib2 
    4.  
    5. def get_body(i): 
    6.  
    7. print "start",i 
    8.  
    9. urllib2.urlopen("http://cn.bing.com"
    10.  
    11. print "end",i 
    12.  
    13. for i in range(3): 
    14.  
    15. t=threading.Thread(target=get_body,args=(i,)) 
    16.  
    17. t.start()  

    运行结不雅:

    解释:大年夜结不雅来看,多线程与协程的效不雅一样,都是达到了IO壅塞时切换的功能。不合的是,多线程切换的是线程(线程间切换),协程切换的是高低文(可以懂得为履行的函数)。而切换线程的开销明显是要大年夜于切换高低文的开销,是以当线程越多,协程的效力就越比多线程的高。(猜想多过程的切换开销应当是最大年夜的)

    Gevent应用解释

    • monkey可以使一些壅塞的模块变得不壅塞,机制:碰到IO操作则主动切换棘手动切换可以用gevent.sleep(0)(将爬虫代码换成这个,效不雅一样可以达到切换高低文)
    • gevent.spawn 启动协程,参数为函数名称,参数名称
    • gevent.joinall 停止协程

    Python3.x协程

    为了测试Python3.x下的协程应用,我在virtualenv下安装了python3.6的情况。

    Python3.4今后惹人了asyncio模块,可以很好的支撑协程。

    asynico

    asyncio是Python 3.4版本惹人的标准库,直接内置了对异步IO的支撑。asyncio的异步操作,须要在coroutine中经由过程yield from完成。

    Usage

    例子:(需在python3.4今后版本应用)

    1. import asyncio 
    2.  
    3. @asyncio.coroutine 
    4.  
    5. def test(i): 
    6.  
    7. print("test_1",i) 
    8.  
    9. r=yield from asyncio.sleep(1) 
    10.  
    11. print("test_2",i) 
    12.  
    13. loop=asyncio.get_event_loop() 
    14.  
    15. tasks=[test(i) for i in range(5)] 
    16.  
    17. loop.run_until_complete(asyncio.wait(tasks)) 
    18.  
    19. loop.close()  

    运行结不雅:

    解释:大年夜运行结不雅可以看到,跟gevent达到的效不雅一样,也是在碰到IO操妆厩?行切换(所以先输出test_1,等test_1输出完再输出test_2)。但此处我有一点不明,test_1的输出为什么不是按照次序履行的呢?可以比较gevent的输出结不雅(欲望大年夜神能解答一下)。

    @asyncio.coroutine把一个generator标记为coroutine类型,然后,我们就把这个coroutine扔到EventLoop中履行。

    test()会起首打印出test_1,然后,yield from语法可以让我们便利地调用另一个generator。因为asyncio.sleep()也是一个coroutine,所以线程不会等待asyncio.sleep(),而是直接中断并履行下一?消息轮回。当asyncio.sleep()返回时,线程就可以大年夜yield from拿到返回值(此处是None),然后接下落行下一行语句。


      推荐阅读

      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)