先持有结果的代表

一个操作尚未结束,调用者也可以先拿到代表其结果的对象,再把后续处理关联到它。结果准备好后,等待者取得值或失败信息,而不必要求启动操作的调用栈一直同步阻塞。

Python的asyncio.Future允许协程等待结果、异常或取消,并允许多次等待同一完成值。它也能把底层回调接口接到async/await;术语Future和Promise在不同系统中的角色划分,则不能仅按名字作统一推断。

参考:[1] [2]

完成状态需要精确定义

ECMAScript的Promise有pending、fulfilled和rejected三种互斥状态,后两者称为settled。resolved却不是fulfilled的同义词:一个Promise可以已经锁定为跟随另一个Promise的状态,而所等待的结果仍然尚未完成。

Python Future也有具体的状态约束:尚未完成就直接调用result会报InvalidStateError,已经完成后再设置结果同样无效。检查状态和按接口完成对象,可以避免把“已经提交”误当成“结果已经取得”。

参考:[2] [1]

结果对象与执行资源分别安排

结果对象本身并不规定新建一个线程。asyncio.Future属于事件循环体系,concurrent.futures.Future则配合执行器使用;两种Python接口的等待、result和回调行为也有明确差别。

取消同样不能一概解释为停止所有底层工作。asyncio的Task取消是向协程提出请求,而Future的取消状态另有规则。使用这些对象时,应同时确认谁负责推进操作、谁能完成结果,以及何种机制能实际停止正在进行的工作。

参考:[1] [3] [4]