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

  • 相关阅读:
    win10 激活
    window10 将程序的快捷方式加到右键"发送到"
    UML 类图基本了解
    php move_uploaded_file 上传的文件移动带中文文件名的的问题
    php 的 PHPExcel1.8.0 使用
    msyql 数据类型存储大小及数据范围
    MySQL数据库设计规范
    测试工具
    show tables 或者 show databases 结果太多如何再筛选
    ubuntu 16.04 周期定时任务 crontab 的 使用
  • 原文地址:https://www.cnblogs.com/saolv/p/9302423.html
Copyright © 2011-2022 走看看