• 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执行携程内剩余代码

  • 相关阅读:
    C#的list和arry相互转化
    c++11の的左值、右值以及move,foward
    c++11の异步方法 及线程间通信
    C#的static
    HDU4027 Can you answer these queries?
    POJ3264 Balances Lineup
    ZOJ1610 Count the Colors
    ZOJ4110 Strings in the Pocket(2019浙江省赛)
    HDU1698 Just a Hook
    POJ3468 A Simple Problem with Integers
  • 原文地址:https://www.cnblogs.com/saolv/p/9302423.html
Copyright © 2020-2023  润新知