استفاده از Future

  • مدرس: علی بیگدلی
  • تاریخ انتشار: 1403/05/11
  • تعداد بازدید: 68

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())

توضیحات

  1. تعریف coroutine:

    • set_future_result: این coroutine یک تأخیر 2 ثانیه‌ای را شبیه‌سازی می‌کند و سپس نتیجه را برای Future تنظیم می‌کند.
  2. ایجاد Future:

    • در تابع main، با استفاده از loop.create_future() یک Future جدید ایجاد می‌شود.
  3. ایجاد یک task جدید:

    • با استفاده از asyncio.create_task(set_future_result(future))، coroutine برای تنظیم نتیجه Future راه‌اندازی می‌شود.
  4. منتظر نتیجه:

    • با استفاده از await future، برنامه منتظر می‌ماند تا نتیجه Future تنظیم شود و سپس آن را دریافت و چاپ می‌کند.

مزایای استفاده از Future

  1. غیرهمزمانی:

    • Future به شما اجازه می‌دهد تا با کارهای غیرهمزمان به راحتی کار کنید و در عین حال انتظار نتایج را به روشی ساختاریافته مدیریت کنید.
  2. مدیریت استثناها:

    • Future می‌تواند استثناهای رخ داده در حین اجرای coroutine را مدیریت کند و شما می‌توانید با استفاده از متد exception() به آن‌ها دسترسی پیدا کنید.
  3. ساختار بهتر:

    • استفاده از Future در مقایسه با رویکردهای سنتی، مانند استفاده از callback‌ها، کد را خواناتر و سازمان‌یافته‌تر می‌کند. با استفاده از async/await، کد شبیه به کد همزمان به نظر می‌رسد.
  4. تغییر حالت:

    • 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، می‌توانید برنامه‌های پیچیده و مقیاس‌پذیری را توسعه دهید که عملکرد مناسبی داشته باشند.


ثبت دیدگاه


نکته: آدرس ایمیل شما منتشر نخواهد شد

دیدگاه کاربران (0)


هیچ دیدگاهی ثبت نشده است می توانید اولین نفر باشید