zoukankan      html  css  js  c++  java
  • python 协程

    import asyncio
    @asyncio.coroutine
    def aa(x):
        print ('1')
        b=yield from x
        print (b)
    
    @asyncio.coroutine
    def bb():
        print ('2')
        yield
        print ('3')
        return 4
      
    x=bb()
    loop = asyncio.get_event_loop()
    loop.run_until_complete(aa(x))
    loop.close()

     以上能揭示由asyncio模块创建的携程的运行过程

    用asyncio提供的@asyncio.coroutine可以把一个generator标记为coroutine类型

    以上代码,首先aa执行,打印1,执行到yield from x,打印2,暂停,而这时,已经没有可执行的携程了,而程序并不会永远暂停下去,这样就打印了3,然后返回4,aa随即打印4

     ,整个过程只进行了一次yield

    所以,一个携程既可以是单个携程,也可以是一个携程嵌套另一还可以是内部包含多个携程,也可以是一个携程包含多个携程,多个携程又各自包含多个携程。总之,不管怎么说,loop.run_until_complete()接受的这个参数就是一个携程。

    关于一个携程内部包含多个携程的概念,请看这一个例子

    asyncio.wait(tasks)这个方法就可以看成返回一个内部包含多个携程的外部携程

    import asyncio
    
    @asyncio.coroutine
    def d():
        print ('d')
        yield
        print ('end')
    @asyncio.coroutine
    def e():
        print ('e')
        yield
        
    
    @asyncio.coroutine
    def f():
        print ('f')
        yield
        
    @asyncio.coroutine
    def g():
        print ('g')
        yield
        
    @asyncio.coroutine
    def h():
        print ('h')
        yield
     
     
    @asyncio.coroutine
    def j():
        print ('j')
        yield  
     
    loop = asyncio.get_event_loop()
    tasks = [d(),e(),f(),g(),h(),j()]
    
    loop.run_until_complete(asyncio.wait(tasks))
    
    loop.close()

    '''
    f
    d
    j
    h
    g
    e
    end
    '''

    注意end永远是最后打印的,这更加说明了,最外层的那个携程内所有携程全部都处于暂停状态的时候,计算机就会跨过携程内的yield执行携程内剩余代码

  • 相关阅读:
    [记录] 原生JS 的常用方法封装
    [记录] JavaScript 中的DOM操作
    [记录] JavaScript 中的正则表达式(案例分析)
    图片查看器插件(带缩略图) viewer.js
    (二) 美化滚动条 JScrollPane.js
    关于数据库存储过程管理的一点建议
    根据属性名称来改变XML节点值
    hdu 3911 Black And White
    poj 3667 Hotel
    hdu 4217 Data Structure?
  • 原文地址:https://www.cnblogs.com/saolv/p/9302423.html
Copyright © 2011-2022 走看看