Future
در پایتون، بهخصوص در ماژول asyncio
، نمایندهای برای نتیجهای است که هنوز محاسبه نشده است. این مفهوم به شما این امکان را میدهد که یک کار را در آینده انجام دهید و در عین حال میتوانید بهصورت غیرهمزمان منتظر نتیجه آن باشید.
تعریف Future
یک Future
نمایندهای از یک عملیات غیرهمزمان است که ممکن است در حال حاضر در حال اجرا باشد یا هنوز آغاز نشده باشد. وقتی که یک Future
تکمیل میشود، میتوانید به نتیجه آن دسترسی پیدا کنید یا به استثنائاتی که در حین اجرای آن ایجاد شدهاند، رسیدگی کنید.
نحوه استفاده از Future
در asyncio
، Future
معمولاً در پسزمینه توسط حلقه رویداد (event loop) مدیریت میشود، اما شما میتوانید بهطور مستقیم با آن کار کنید. برای ایجاد یک Future
، میتوانید از متد loop.create_future()
استفاده کنید.
مثال از نحوه استفاده از Future
در اینجا یک مثال ساده از نحوه استفاده از Future
آورده شده است:
import asyncio
async def set_future_result(future):
await asyncio.sleep(2) # شبیهسازی کار غیرهمزمان
future.set_result("Result is ready!") # تنظیم نتیجه
async def main():
loop = asyncio.get_running_loop()
future = loop.create_future() # ایجاد یک Future جدید
# راهاندازی coroutine برای تنظیم نتیجه
asyncio.create_task(set_future_result(future))
print("Waiting for the result...")
result = await future # منتظر نتیجه
print(f"Received: {result}")
asyncio.run(main())
توضیحات
-
تعریف coroutine:
set_future_result
: این coroutine یک تأخیر 2 ثانیهای را شبیهسازی میکند و سپس نتیجه را برایFuture
تنظیم میکند.
-
ایجاد
Future
:- در تابع
main
، با استفاده ازloop.create_future()
یکFuture
جدید ایجاد میشود.
- در تابع
-
ایجاد یک task جدید:
- با استفاده از
asyncio.create_task(set_future_result(future))
، coroutine برای تنظیم نتیجهFuture
راهاندازی میشود.
- با استفاده از
-
منتظر نتیجه:
- با استفاده از
await future
، برنامه منتظر میماند تا نتیجهFuture
تنظیم شود و سپس آن را دریافت و چاپ میکند.
- با استفاده از
مزایای استفاده از Future
-
غیرهمزمانی:
Future
به شما اجازه میدهد تا با کارهای غیرهمزمان به راحتی کار کنید و در عین حال انتظار نتایج را به روشی ساختاریافته مدیریت کنید.
-
مدیریت استثناها:
Future
میتواند استثناهای رخ داده در حین اجرای coroutine را مدیریت کند و شما میتوانید با استفاده از متدexception()
به آنها دسترسی پیدا کنید.
-
ساختار بهتر:
- استفاده از
Future
در مقایسه با رویکردهای سنتی، مانند استفاده از callbackها، کد را خواناتر و سازمانیافتهتر میکند. با استفاده ازasync/await
، کد شبیه به کد همزمان به نظر میرسد.
- استفاده از
-
تغییر حالت:
Future
به شما اجازه میدهد که به راحتی وضعیت کارهای غیرهمزمان را تغییر دهید و به آنها رسیدگی کنید، مانند لغو یا توقف یک کار در حال اجرا.
مدیریت خطا در Future
به شما این امکان را میدهد که بهراحتی با استثناهایی که در حین اجرای coroutineها رخ میدهند، برخورد کنید. در اینجا یک مثال از نحوه مدیریت خطا در Future
آورده شده است.
import asyncio
async def set_future_result(future):
await asyncio.sleep(2) # شبیهسازی کار غیرهمزمان
# ایجاد یک استثنا برای شبیهسازی خطا
future.set_exception(ValueError("An error occurred!")) # تنظیم استثنا
async def main():
loop = asyncio.get_running_loop()
future = loop.create_future() # ایجاد یک Future جدید
# راهاندازی coroutine برای تنظیم نتیجه یا استثنا
asyncio.create_task(set_future_result(future))
print("Waiting for the result...")
try:
result = await future # منتظر نتیجه
print(f"Received: {result}")
except Exception as e:
print(f"Caught an exception: {e}")
asyncio.run(main())
Future
ابزاری قدرتمند در ماژول asyncio
است که به شما این امکان را میدهد تا بهصورت غیرهمزمان با نتایج کارها کار کنید و در عین حال از مدیریت استثناها و تغییر وضعیت بهراحتی بهرهمند شوید. با استفاده از Future
، میتوانید برنامههای پیچیده و مقیاسپذیری را توسعه دهید که عملکرد مناسبی داشته باشند.