• await这个关键词以及asyncio.wait asyncio.gather


    1.asyncio.wait asyncio.gather这两个都是接受多个future或coro组成的列表,但是不同的是,asyncio.gather会将列表中不是task的coro预先封装为future,而wait则不会。

    不过,loop.run_until_complete(asyncio.wait(tasks))运行时,会首先将tasks列表里的coro先转换为future

    2.await关键词。异步io的关键在于,await io操作,此时,当前携程就会被挂起,时间循环转而执行其他携程,但是要注意前面这句话,并不是说所有携程里的await都会导致当前携程的挂起,要看await后面跟的是什么,如果跟的是我们定义的携程,则会执行这个携程,如果是asyncio模块制作者定义的固有携程,比如模拟io操作的asyncio.sleep,以及io操作,比如网络io:asyncio.open_connection这些,才会挂起当前携程。

    3.关于asyncio.as_completed.的运行原理:

    import asyncio
    import time
    
    async def a():
        print ("1")
        return 8
    
    b=asyncio.ensure_future(a())
    loop = asyncio.get_event_loop()
    loop.run_until_complete(b)
    #运行到这里产生了一个已经执行完毕的task-b
    async def do_some_work(x):
        time.sleep(2)
        print("waiting:",x)
        await asyncio.sleep(x)
        return "Done after {}s".format(x)
    
    async def main():
        coroutine1 = do_some_work(1)
        coroutine2 = do_some_work(2)
        coroutine3 = do_some_work(4)
        coroutine4 = do_some_work(4)
        coroutine5 = do_some_work(4)
        coroutine6 = do_some_work(4)
        coroutine7 = do_some_work(4)
        coroutine8 = do_some_work(4)
        coroutine9 = do_some_work(4)
        tasks = [
            coroutine1,
            coroutine2,
            b,
            coroutine3,
            coroutine4,
            coroutine5,
            coroutine6, 
            coroutine7,
            coroutine8,
            coroutine9,       
        ]#故意在这个tasks列表中加入已经完成的task-b
        for task in asyncio.as_completed(tasks):#这条语句会首先将tasks列表中的coro转为task
            print ("gaga")
            result = await task#挂起当前携程,转而执行别的携程,直到所有的携程全部挂起的时候,本携程才能再次拿到执行权,因为最早完成的是b,所以result是8
            print("Task ret: {}".format(result))
    
    loop.run_until_complete(main())#这条语句首先将main()转为task,目前只有这一个pending状态的task,和之前finished状态的b,所以先执行这个。
    #我这里两次运行了run_until_complete

     4.ensure_future的作用,比如ensure_future(b())是将b()携程(coro)加入到task中,当我们启动eventloop的时候,就会按照task产生的先后顺序依次去执行。

    #!/usr/bin/env py3
    
    import asyncio
    async def a():
        print ("a")
    async def b():
        print ("b")
    
    asyncio.ensure_future(a())
    bb=asyncio.ensure_future(b())
    loop = asyncio.get_event_loop()
    loop.run_until_complete(bb)#虽然传入的参数是task-bb,但是task-a却会执行,
    #并且是第一个执行,首先打印a,其次打印b
  • 相关阅读:
    BZOJ1691: [Usaco2007 Dec]挑剔的美食家
    BZOJ1584: [Usaco2009 Mar]Cleaning Up 打扫卫生
    BZOJ3057: 圣主的考验
    BZOJ1770: [Usaco2009 Nov]lights 燈
    1710: [Usaco2007 Open]Cheappal 廉价回文
    「Poetize7」电话线路
    「Poetize6」Candle
    「Poetize5」水叮当的舞步
    解题:CF983A Finite or not
    解题:POI 2013 Triumphal arch
  • 原文地址:https://www.cnblogs.com/saolv/p/9975383.html
Copyright © 2020-2023  润新知