Board logo

标题: Python并发之异步I/O(async,await)-3 [打印本页]

作者: look_w    时间: 2019-3-4 19:02     标题: Python并发之异步I/O(async,await)-3

例子1

少废话,直接看例子。

    import asyncio
    import time
     
    start = time.time()
     
     
    def tic():
        return 'at %1.1f seconds' % (time.time() - start)
     
     
    async def gr1():
        # Busy waits for a second, but we don't want to stick around...
        print('gr1 started work: {}'.format(tic()))
        # 暂停两秒,但不阻塞时间循环,下同
        await asyncio.sleep(2)
        print('gr1 ended work: {}'.format(tic()))
     
     
    async def gr2():
        # Busy waits for a second, but we don't want to stick around...
        print('gr2 started work: {}'.format(tic()))
        await asyncio.sleep(2)
        print('gr2 Ended work: {}'.format(tic()))
     
     
    async def gr3():
        print("Let's do some stuff while the coroutines are blocked, {}".format(tic()))
        await asyncio.sleep(1)
        print("Done!")
     
    # 事件循环
    ioloop = asyncio.get_event_loop()
     
    # tasks中也可以使用asyncio.ensure_future(gr1())..
    tasks = [
        ioloop.create_task(gr1()),
        ioloop.create_task(gr2()),
        ioloop.create_task(gr3())
    ]
    ioloop.run_until_complete(asyncio.wait(tasks))
    ioloop.close()
     
     
    output:
        gr1 started work: at 0.0 seconds
        gr2 started work: at 0.0 seconds
        Let's do some stuff while the coroutines are blocked, at 0.0 seconds
        Done!
        gr2 Ended work: at 2.0 seconds
        gr1 ended work: at 2.0 seconds

    asyncio.wait(...) 协程的参数是一个由future或协程构成的可迭代对象;wait 会分别
    把各个协程包装进一个 Task 对象。最终的结果是,wait 处理的所有对象都通过某种方式变成 Future 类的实例。wait 是协程函数,因此返回的是一个协程或生成器对象。

    ioloop.run_until_complete 方法的参数是一个future或协程。如果是协程,run_until_complete方法与 wait 函数一样,把协程包装进一个 Task 对象中。

    在 asyncio 包中,future和协程关系紧密,因为可以使用 yield from 从asyncio.Future 对象中产出结果。这意味着,如果 foo 是协程函数(调用后返回协程对象),抑或是返回Future 或 Task 实例的普通函数,那么可以这样写:res = yield from foo()。这是 asyncio 包的 API 中很多地方可以互换协程与期物的原因之一。 例如上面的例子中tasks可以改写成协程列表:tasks = [gr1(), gr(2), gr(3)]




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0