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())
本文通过示例介绍了Python中Future对象的基本用法,包括如何创建Future对象并等待其完成,以及如何结合线程池或进程池使用Future对象进行异步操作。
1708

被折叠的 条评论
为什么被折叠?



