Future对象
Task 继承Future,Task对象内部await结果的处理基于Future对象来的。
示例1:
import asyncio
async def main():
# 获取当前事件循环
loop = async.get_running_loop()
# 创建一个任务(Future对象),这个任务什么都不做
fut = loop.create_future()
# 等待任务最终结果(Future对象),没有结果则会一直等下去
await fut
asynio.run(main())
# 示例2:
import asyncio
async def set_after(fut):
await asyncio.sleep(2)
fut.set_result('666')
async def main():
# 获取当前事件循环
loop = asyncio.get_running_loop()
# 创建一个任务(Future对象),没绑定任何行为,则这个任务永远不知道什么时候结束
fut = loop.create_future()
# 创建一个任务(Future对象),绑定了set_after函数,函数内部在2s之后,会给fut赋值。
# 即手动设置future任务的最终结果,那么fut就可以结束了。
await loop.create_task(set_after(fut))
# 等待Future对象获取最终结果,否则一直等下去
data = await fut
print(data)
asyncio.run(main())
# 666
# 3.5 concurrent.futures.Future对象 # 使用线程池、进程池实现异步操作时用到的对象 import time from concurrent.futures import Future from concurrent.futures.thread import ThreadPoolExecutor from concurrent.futures.process import ProcessPoolExecutor def func(value): time.sleep(1) print(value) return 123 # 创建线程池 pool = ThreadPoolExecutor(max_workers=5) # 创建进程池 # pool = ProcessPoolExecutor(max_workers=5) for i in range(10): fut = pool.submit(func, i) print(fut) # 以后写代码可能会存在交叉时间。例如:CRM项目80%都是基于协程异步编程 + MySQL(不支持)【线程、进程做异步编程】 import time import asyncio import concurrent.futures def func1(): time.sleep(2) return "123" async def main(): loop = asyncio.get_running_loop() fut = loop.run_in_executor(None, func1) result = await fut print('default thread pool', result) asyncio.run(main())