8.1 Future類別的基本特性
Module asyncio的 Future類別是一個 將來會可用的非同步操作結果。 Future物件用於管理非同步任務的狀態和結果。
Future類別的基本特性
Future物件是一個容器,用來容納在任務完成執行後才能可用的結果。它提供了 獲取非同步操作完成後的結果或例外情況的接口。
創建和管理Future物件
- 創建: 通常使用
loop.create_future()創建。 - 設置結果: 使用方法
set_result(result)設置結果。 - 設置例外: 使用方法
set_exception(exception)設置例外。
主要方法和屬性
set_result(result):
設置Future物件的結果。所有等待此物件的協程將立即以此結果恢復。
set_exception(exception):
設置Future物件的例外。所有等待此物件的協程將立即以此例外恢復。
result():
如果結果可用,返回Future物件的結果。如果操作以例外結束,將引發該例外。
exception():
如果已設置,返回例外,或者None,如果Future物件尚未完成或成功完成。
done():
如果Future物件完成(有結果或例外),返回True。
add_done_callback(callback):
在Future物件完成時,添加將被調用的回調。
8.2 使用範例
設置和獲取結果
import asyncio
async def set_future_result(fut, delay):
await asyncio.sleep(delay)
fut.set_result("Future result is ready")
async def main():
loop = asyncio.get_running_loop()
fut = loop.create_future()
asyncio.create_task(set_future_result(fut, 2))
result = await fut
print(result)
asyncio.run(main())
處理例外
import asyncio
async def set_future_exception(fut, delay):
await asyncio.sleep(delay)
fut.set_exception(ValueError("An error occurred"))
async def main():
loop = asyncio.get_running_loop()
fut = loop.create_future()
asyncio.create_task(set_future_exception(fut, 2))
try:
result = await fut
except ValueError as e:
print(f"Caught an exception: {e}")
asyncio.run(main())
與任務交互
Future物件通常與(Tasks)任務結合使用。當使用asyncio.create_task()創建任務時,它會自動 創建Future物件,可用於追踪和管理任務的狀態。
import asyncio
async def example_coroutine():
await asyncio.sleep(1)
return "Task result"
async def main():
task = asyncio.create_task(example_coroutine())
print(await task)
asyncio.run(main())
8.3 優勢和特性
Future物件允許管理非同步操作的結果和例外,提供了 執行的靈活性和控制。Future可以在多種非同步編程場景中使用, 包括任務、計時器、回調等等。
Future物件通常與(Tasks)任務結合使用。這種方法允許更高層次的控制 於非同步操作的執行和狀態。
限制
在某些情況下,Future的使用可能比使用更高層次的抽象(如(Tasks)任務或協程)更為複雜。使用Future可能 需要更多的手動管理非同步操作的狀態和結果。
GO TO FULL VERSION