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)
标签:__,协程,print,async,def,asyncio
From: https://www.cnblogs.com/Wesuiliye/p/17177296.html