协程&异步编程&asyncio
1.项目示例
1.1在python3.7 之前的版本
主要为
asyncio.ensure_future() 实例化task
使用
loop = asyncio.get_event_loop()
done, deping = loop.run_until_complete(asyncio.wait(tasks, timeout=4))
来运行
import asyncio
async def run():
print("hello")
await asyncio.sleep(5)
print("world")
async def run1():
print("hello")
await asyncio.sleep(3)
print("world")
# 创建并发
tasks = [asyncio.ensure_future(run()), asyncio.ensure_future(run1())]
# 创建应用池
loop = asyncio.get_event_loop()
# done 完成的
# deping 未完成的
# timeout 最长等带时间
done, deping = loop.run_until_complete(asyncio.wait(tasks, timeout=4))
print("done:", done)
print("deping:", deping)
hello hello world done: {<Task finished name='Task-2' coro=<run1() done, defined at c:\Users\Administrator\Desktop\exam\协程\旧的版本.py:8> result=None>} deping: {<Task pending name='Task-1' coro=<run() running at c:\Users\Administrator\Desktop\exam\协程\旧的版本.py:5> wait_for=<Future pending cb=[<TaskWakeupMethWrapper object at 0x000001EF104A8040>()]>>}
1.2.在python3.7 之后
将 手动创建 task 和 运行方式进行了修改
使用: async.create_task() 来创建task 实例
使用 : asyncio.run() 来运行
示例:
import asyncio
async def run():
print("hello")
await asyncio.sleep(2)
print("world")
return 1
async def run1():
print("hello")
await asyncio.sleep(5)
print("world")
# 主函数
async def main():
# 创建task, name 任务名称
tasks = [ asyncio.create_task(run(), name="n1"),
asyncio.create_task(run(), name="n2")]
# done 已完成的
# pending 未完成的
# 这一步主要是为了执行 tasks 里的---> 等待 task里的任务
done, pending = await asyncio.wait(tasks, timeout=None)
return done, pending
# 运行
done, pending = asyncio.run( main() )
print("done:", done)
print("pending:", pending)
C:\Users\Administrator\Desktop\exam>C:/Python39/python.exe "c:/Users/Administrator/Desktop/exam/协程/1. 简单示例3.4后.py"
hello
hello
world
world
done: {<Task finished name='n1' coro=<run() done, defined at c:\Users\Administrator\Desktop\exam\协程\1. 简单示例3.4后.py:3> result=1>, <Task finished name='n2' coro=<run() done, defined at c:\Users\Administrator\Desktop\exam\协程\1.
简单示例3.4后.py:3> result=1>}
pending: set()
2.await ----->等待
await + 可等待对象 (协程对象, Future 对象, Task 对象) ---> IO 等待
携程对象: ----> async 修饰的函数 + ()
流程:
如果有其他任务, 在遇到IO等待(await) 的时候去执行其他任务。
示例1:
import asyncio
async def other():
print("hello")
await asyncio.sleep(3)
print("world")
return "返回值"
asyncio.run(other())
hello
world
示例2:
import asyncio
async def other():
print("hello")
await asyncio.sleep(3)
print("world")
return "返回值"
async def func():
print("执行协程函数内部代码")
#respone = await func()
task = asyncio.create_task(other())
print("执行结束")
asyncio.run(func())
结果:
执行协程函数内部代码
执行结束
hello
在这里我们发现, 我们开始执行协程内部代码遇到内部的await 并没有等,而是直接结束了,
示例3:
import asyncio
async def other():
print("hello")
await asyncio.sleep(3)
print("world")
return "返回值"
async def func():
print("执行协程函数内部代码")
respone = await other()
print("执行结束")
asyncio.run(func())
执行协程函数内部代码
hello
world
执行结束
我们发现这样只有等内部结束后才会执行,外部接下来的代码
示例4:
import asyncio
async def other():
print("hello")
await asyncio.sleep(3)
print("world")
return "返回值"
async def other2():
print("other---->开始")
await asyncio.sleep(5)
print("other ----> 结束")
async def func():
print("执行协程函数内部代码")
respone = await other()
respone2 = await other2()
print("执行结束")
asyncio.run(func())
执行协程函数内部代码
hello
world
other---->开始
other ----> 结束
执行结束
同样, await 结束后才执行下一个
3.task
在事件循环中并发的添加多个任务的。可以说解决了上面的 await 的问题。
1. 使用asyncio.create_tak() 创建 3.7 之后, 建议
2. loop.create_task() 或者 asyncio.ensure_future() 来创建
async def run():
print("hello")
await asyncio.sleep(2)
print("world")
return 1
async def run1():
print("hello")
await asyncio.sleep(5)
print("world")
tasks = [run(), run1()]
done, pending = asyncio.run( asyncio.wait(tasks) )
print("done:", done)
print("pending:", pending)
import asyncio
async def run():
print("hello")
await asyncio.sleep(2)
print("world")
return 1
async def run1():
print("hello")
await asyncio.sleep(5)
print("world")
# 主函数
async def main():
# 创建task, name 任务名称
tasks = [ asyncio.create_task(run(), name="n1"),
asyncio.create_task(run(), name="n2")]
# done 已完成的
# pending 未完成的
# 这一步主要是为了执行 tasks 里的---> 等待 task里的任务
done, pending = await asyncio.wait(tasks, timeout=None)
return done, pending
# 运行
done, pending = asyncio.run( main() )
print("done:", done)
print("pending:", pending)
4. asyncio.Future 对象
他是 task 的基类,
Task 继承 Future, Task 对象内部 await 结果的处理基于Future 对象来的。
5. concurrent.futures.Future 对象
使用线程池、进程池实现异步操作时用到的对象。