协程

 

import asyncio
import time

# 协程(Coroutine),也可以被称为微线程,是一种用户态内的上下文切换技术。
# 简而言之,其实就是通过一个线程实现代码块相互切换执行
# asyncio是Python 3.4版本引入的标准库,直接内置了对异步IO的支持。


# asyncio def func():
#     print("hello,world")
#
# if __name__ == '__main__':
#     g = func() # 此时的函数是异步协程函数,此时函数执行得到的是一个协程对象
#     asyncio.run(g) # 协程程序运行需要asyncio模块的支持

# async def func1():
#     print("1111")
#     # time.sleep(3)  # 当程序出现了同步操作的时候,异步就中断了
#     await asyncio.sleep(3)
#     print("1111")
#
#
# async def func2():
#     print("2222")
#     # time.sleep(3)
#     await asyncio.sleep(2)
#     print("2222")
#
#
# async def func3():
#     print("3333")
#     # time.sleep(3)
#     await asyncio.sleep(4)
#     print("3333")


# if __name__ == '__main__':
#     f1 = func1()
#     f2 = func2()
#     f3 = func3()
#
#     tasks = [
#         f1, f2, f3
#     ]
#     t1 = time.time()
#     # 一次性启动多个任务(协程)
#     asyncio.run(asyncio.wait(tasks))
#     t2 = time.time()
#     print(t2 - t1)


'''
async 关键字
    协程函数:定义函数时候由async关键字装饰的函数 async def 函数名
    协程对象:执行协程函数得到的协程对象。

协程函数
    async def func():
        pass
协程对象
    result = func()
    注意:执行协程函数只会创建协程对象,函数内部代码不会执行。
    如果想要运行协程函数内部代码,必须要将协程对象交给事件循环来处理。
    
    import asyncio
    
    async def func():
        print("执行协程函数内部代码!")
    result = func()

    # 调用方法1:# python3.6及以下版本写法
        loop = asyncio.get_event_loop()
        loop.run_until_complete( result )
        loop.close()

    # 调用方法2: # python3.7才支持这种写法,作为一个入口函数
        asyncio.run(result)
        
await 关键字
    await + 可等待的对象(协程对象、Future、Task对象 -> IO等待),遇到IO操作挂起当前协程(任务),等IO操作完成之后再继续往下执行。
    当前协程挂起时,事件循环可以去执行其他协程(任务)。

Task 对象
    Task对象的作用是在事件循环中添加多个任务,用于并发调度协程,
    通过asyncio.create_task(协程对象)的方式创建Task对象,这样可以让协程加入事件循环中等待被调度执行。
    也可以写个函数:
       async def main():
            takes = [
                asyncio.create_task(func1()),
                asyncio.create_task(func2()),
                asyncio.create_task(func3()),
            ]
        if __name__ == '__main__':
            # 一次性启动多个任务(协程)
            asyncio.run(main())
'''


async def func1():
    print("1111")
    await asyncio.sleep(3)  # 耗时操作
    print("1111")


async def func2():
    print("2222")
    await asyncio.sleep(2)  # 耗时操作
    print("2222")


async def func3():
    print("3333")
    await asyncio.sleep(4)  # 耗时操作
    print("3333")


async def main():
    # 第一种写法
    # f1 = func1()
    # await f1 # 一般await挂起操作放在协程对象前面

    takes = [
        asyncio.create_task(func1()),
        asyncio.create_task(func2()),
        asyncio.create_task(func3()),
    ]
    # print(takes)
    # asyncio.run(asyncio.wait(takes))
    await asyncio.wait(takes)


if __name__ == '__main__':
    t1 = time.time()
    # 一次性启动多个任务(协程)
    asyncio.run(main())
    t2 = time.time()
    print(t2 - t1)
posted @ 2023-03-03 22:52  0x1e61  阅读(13)  评论(0编辑  收藏  举报